2011-03-23 52 views
0

这是我的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)的表达式的评估。

+0

可能与您的问题无关,但我注意到''alloc'正在调用'[super init]',这意味着'[[self alloc] init]'调用'[super init]'两次。 – 2011-03-23 02:51:14

+0

'init'方法也是错误的。 – bbum 2011-03-23 06:31:04

回答

0

没关系的家伙。我发现了错误。事实证明,当你在NSMutableDictionary(设置对象)中过度释放一个对象时(我认为我将该特定对象复制到另一个对象,但它成为NSMutableDictionary中对象的指针),设置对象释放自身以及?整个NSMutableDictionary变得无法访问。不可能调试的人!

0

设置在调试器变量的设置一个观察点......

watch settings == nil 

和何时/何变量被释放它就会停止。

+0

我试过了:看[[SettingsManager sharedSettingsManager] getSettingsArray] ==零,但它从来没有停止。在调试时它说它已经被释放。 – ninjaneer 2011-03-23 02:36:00

0

你在哪里打电话[[SettingsManager sharedSettingsManager] settings]
你如何处理返回的对象?

你可能有类似以下的东西吗?

NSMutableDictionary *s = [[SettingsManager sharedSettingsManager] settings]; 
⋮ 
[s release]; 

如果是这种情况,那么你应该小心无论是先发-retain对象(从-settings得到它后),或发送-release避免。或者,您可能需要重写-settings,以便它返回字典的自动发布副本而不是字典本身(以防止主叫方将其从“下方”修改为您)。

您可能想要查看Memory Management Programming Guide及其Object Ownership and DisposalAccessor Methods部分。

+0

我永远不会返回设置数组。我只是使用代码中概述的get和set方法。 – ninjaneer 2011-03-23 04:50:58