這是我的Singleton對象。單身人士課程成員正在發佈?
#import "SettingsManager.h"
//#import "SynthesizeSingleton.h"
@implementation SettingsManager
//SYNTHESIZE_SINGLETON_FOR_CLASS(SettingsManager);
static SettingsManager* _sharedSettingsManager =nil;
-(NSString *)getString:(NSString*)value
{
return [settings objectForKey:value];
}
-(NSMutableDictionary*)getSettingsArray
{
return settings;
}
-(int)getInt:(NSString*)value {
return [[settings objectForKey:value] intValue];
}
-(void)setValue:(NSString*)value newString:(NSString *)aValue {
[settings setObject:aValue forKey:value];
}
-(void)setValue:(NSString*)value newInt:(int)aValue {
[settings setObject:[NSString stringWithFormat:@"%i",aValue] forKey:value];
}
-(void)save
{
[[NSUserDefaults standardUserDefaults] setObject:settings forKey:@"ClimbingStrategy"];
[[NSUserDefaults standardUserDefaults] synchronize];
}
-(void)load
{
[settings addEntriesFromDictionary:[[NSUserDefaults standardUserDefaults] objectForKey:@"ClimbingStrategy"]];
}
-(void)logSettings
{
for(NSString* item in [settings allKeys])
{
NSLog(@"[SettingsManager KEY:%@ - VALUE:%@]", item, [settings valueForKey:item]);
}
}
+(SettingsManager*)sharedSettingsManager
{
if(!_sharedSettingsManager)
{
_sharedSettingsManager = [[super allocWithZone:NULL] init];
}
return _sharedSettingsManager;
}
+ (id)allocWithZone:(NSZone *)zone
{
return [[self sharedSettingsManager] retain];
}
- (id)copyWithZone:(NSZone *)zone
{
return self;
}
- (id)retain
{
return self;
}
- (NSUInteger)retainCount
{
return NSUIntegerMax; //denotes an object that cannot be released
}
- (void)release
{
//do nothing
}
- (id)autorelease
{
return self;
}
-(id)init {
settings = [[NSMutableDictionary alloc] initWithCapacity:10];
return [super init];
}
@end
其中settings是一個NSMutableDictionary。 4或5訪問單例對象後,單例對象釋放「設置」字典。我找不到我編寫這個錯誤的地方。我已經試過了,但是我從未找到設置對象神奇消失時的確切位置。
更新 我更新了代碼,直接從蘋果網站上覆制。我也用這個宏作爲單例。兩者在設置nsmutabledictionary時仍然有問題。
UPDATE2: 我得到這個,當我嘗試訪問設置陣列:
計劃接收信號EXC_BAD_ACCESS,無法訪問內存。 原因:地址中的KERN_INVALID_ADDRESS:0x59200000 0x0177d09f in objc_msgSend() 正在調試的程序在從GDB調用的函數中發出信號。 GDB已將上下文恢復到調用之前的狀態。 要更改此行爲,請使用「set unwindonsignal off」 將放棄包含函數(_NSPrintForDebugger)的表達式的評估。
可能與您的問題無關,但我注意到''alloc'正在調用'[super init]',這意味着'[[self alloc] init]'調用'[super init]'兩次。 – 2011-03-23 02:51:14
'init'方法也是錯誤的。 – bbum 2011-03-23 06:31:04