NSMutableDictionary单身人士问题

时间:2011-09-14 19:22:12

标签: objective-c singleton nsmutabledictionary

我使用Cocos2D框架编写Objective-C,我有一个用于多种目的的单例。一个新的目的是获取和设置字符串的“状态”。我最近为此目的制作了一个NSDictionary,但是当调用单例中的方法时,我遇到了冻结程序的问题。

这是单身代码。我只是离开角色状态:

·H

@interface ExGlobal : NSObject { 

    NSArray *charStates_keys;
    NSArray *charStates_objects;

    NSMutableDictionary *charStates;
} 

@property(nonatomic, retain) NSMutableDictionary *charStates;

+(ExGlobal*)sharedSingleton; 

- (NSString *)charState:(NSString *)charName;
- (void)set_charState:(NSString *)value forCharName:(NSString *)charName;

@end 

的.m

#import "ExGlobal.h" 

@implementation ExGlobal 

@synthesize charStates;

static ExGlobal* _sharedSingleton = nil; 

+(ExGlobal*)sharedSingleton { 
    @synchronized([ExGlobal class]) {

        if (!_sharedSingleton) { 
            [[self alloc] init]; 
        } 

        return _sharedSingleton; 
    } 

    return nil; 
} 

+(id)alloc { 
    @synchronized([ExGlobal class]) { 

        NSAssert(_sharedSingleton == nil, @"Attempted to allocate a second instance of a singleton."); 
        _sharedSingleton = [super alloc]; 
        return _sharedSingleton; 

    } 

    return nil; 
} 

-(id)init { 
    self = [super init]; 
    if (self != nil) { 
        // initialize stuff here 

        exitName = @"ruinsSkyMid";

        sceneChangeKind = @"reborn";

        charStates = [[NSMutableDictionary alloc] init];

        charStates_keys = [NSArray arrayWithObjects:@"Feathers", @"Hummus", nil];

        charStates_objects = [NSArray arrayWithObjects:@"at wall", @"with Feathers", nil];

        charStates = [NSMutableDictionary dictionaryWithObjects:charStates_objects forKeys:charStates_keys];

    } 
    return self; 
} 


- (NSString *)charState:(NSString *)charName{

    NSString *value = [charStates objectForKey:charName];

    return value;

}

- (void)set_charState:(NSString *)charState forCharName:(NSString *)charName{

    [charStates setObject:charState forKey:charName];

}

- (void)dealloc {
    //I know it doesn't get called, but just in case
    [charStates release];

    [super dealloc];
}


@end 

我不清楚冻结时究竟是什么问题。发生这种情况时,我进入控制台的所有内容都是:

    Program received signal:  “EXC_BAD_ACCESS”.
warning: Unable to read symbols for /Developer/Platforms/iPhoneOS.platform/DeviceSupport/4.3.5 (8L1)/Symbols/Developer/usr/lib/libXcodeDebuggerSupport.dylib (file not found).
Previous frame inner to this frame (gdb could not unwind past this frame)
Previous frame inner to this frame (gdb could not unwind past this frame)

我确信这无助于找到问题。我发现如果我在charState和set_charState方法中重新定义charStates_keys,charStates_objects和charStates,它似乎没有冻结,除了set_charState不会改变状态。

2 个答案:

答案 0 :(得分:2)

它没有冻结,它正在崩溃。因此EXC_BAD_ACCESS。看起来您的Xcode安装也很糟糕,因为下面的两条消息不应该发生。

请注意,方法名称中不应包含_个;不是问题的原因,而是对以下惯例的评论。

您没有保留charStates,这可能是导致崩溃的原因。

答案 1 :(得分:2)

不是这样的答案,但我在上面的评论字段中没有足够的空间来发布这个,但它可能有用。

正如bbum已经说过的那样,你缺乏保留charStates可能就是问题所在。

如果您对何时保留和不保留对象感到困惑,那么有一本非常好的书叫“在Mac上学习Objective-C”,我知道它是一本Mac书,但大多数也适用于iPhone。在第9章(内存管理)的第171页上,它讨论了“内存管理规则”以及如果您对何时保留或不保留感到困惑,那么您不了解Objective C内存管理的简单规则。

基本上,如果使用new,alloc或copy创建对象,则保留计数会自动设置为1,因此保留对象并且不需要您保留它,并且需要后续释放才能解除分配。

如果以任何其他方式创建对象,则该对象将是自动释放的对象。

显然,这些规则仅适用于标准iOS库,不一定适用于第三方库。

我建议任何不完全理解Objective C内存管理的人阅读本书。即使是我的iPhone工作,我也觉得很有启发性。

希望有帮助/.