以某种方式释放单身人士班的成员?

时间:2011-03-23 02:06:32

标签: objective-c xcode

这是我的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 objc_msgSend()中的0x0177d09f 正在调试的程序在从GDB调用的函数中发出信号。 GDB已将上下文恢复到调用之前的状态。 要更改此行为,请使用“set unwindonsignal off” 评估包含该函数的表达式(_NSPrintForDebugger)将被放弃。

5 个答案:

答案 0 :(得分:0)

Objective-C中的单身人士通常会覆盖release以防止这种情况发生。请参阅sample code in the Cocoa Fundamentals Guide

答案 1 :(得分:0)

在调试器中的settings变量上设置观察点...

watch settings == nil

并且当变量被释放时它将停止。

答案 2 :(得分:0)

Matt Gallager有一个基于Apple代码的插入式宏,可以很容易地实现单例。在“可可中的单身人士”部分的页面下方有一段代码链接:

http://cocoawithlove.com/2008/11/singletons-appdelegates-and-top-level.html

答案 3 :(得分:0)

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

你可能有类似下面的内容吗?

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

如果是这种情况,那么您应该注意先向对象发送-retain(从-settings获取后),或者不要发送-release。或者,您可能想要重写-settings,以便它返回字典的自动释放副本而不是字典本身(以防止调用者从“下面”修改它)。

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

答案 4 :(得分:0)

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