这是我的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