2011-03-23 53 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