NSMutableDictionary Singleton проблема - PullRequest
0 голосов
/ 14 сентября 2011

Я кодирую Objective-C с использованием фреймворка Cocos2D, и у меня есть синглтон, используемый для нескольких целей. Одна из новых целей - получить и установить «состояния» персонажа, которые являются строками. Я недавно сделал 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)

Что, я уверен, не поможет найти проблему. Я обнаружил, что если я переопределю charStates_keys, charStates_objects и charStates внутри методов charState и set_charState, то, похоже, он работает без замораживания, за исключением того, что set_charState не изменяет состояние.

Ответы [ 2 ]

2 голосов
/ 15 сентября 2011

Не ответ как таковой, но у меня не было достаточно места в поле комментариев выше, чтобы опубликовать это, но это может быть полезно.

Как уже сказал bbum, ваше отсутствие сохранения charStates, вероятно, являетсяпроблема.

Если вы не понимаете, когда сохранять или не сохранять объекты, есть действительно хорошая книга под названием «Learn Objective-C на Mac», и я знаю, что это книга для Mac, но большая часть относится и к iPhone.,На странице 171 главы 9 (Управление памятью) говорится о «Правилах управления памятью» и о том, как, если вы не понимаете, когда сохранять или нет, вы не понимаете простых правил управления памятью в Objective C.

По существу, если вы создаете объект с использованием new, alloc или copy, тогда для счетчика сохранения автоматически устанавливается значение 1, поэтому объект сохраняется и не требует его сохранения, а для освобождения потребуется последующее освобождение.

Если вы создаете объект любым другим способом, тогда этот объект будет автоматически освобожденным объектом.

Очевидно, что эти правила применяются только в стандартных библиотеках iOS и не обязательно могут применяться к сторонним библиотекам.

Я рекомендую всем, кто не полностью понимает управление памятью в Цели C, прочитать эту книгу.Я нашел очень поучительным даже для моей работы iPhone.

Надеюсь, что помогает /.

2 голосов
/ 14 сентября 2011

Не замерзает, а падает.Отсюда EXC_BAD_ACCESS.Похоже, что ваша установка XCode не выполняется, поскольку следующие два сообщения не должны происходить:

Обратите внимание, что в именах методов не должно быть _ s;не причина проблемы, а комментарий к следующему соглашению.

Вы не сохраняете charStates, и это, вероятно, является причиной сбоя.

...