Неверный селектор отправлен на экземпляр - objectForKey: - PullRequest
0 голосов
/ 18 августа 2011

Я получаю ошибку при запуске моего кода. Виновником является то, что я получил доступ к строке из списка ниже:

    NSString *sImageFile = [dictionary objectForKey:@"answerCorrect"];
    NSLog(@"%@",sImageFile);

У меня есть это в моем cocos2d Init, показанном здесь:

-(id) init
{
    // always call "super" init
    // Apple recommends to re-assign "self" with the "super" return value
    if( (self=[super init])) {

        NSUserDefaults *sud = [NSUserDefaults standardUserDefaults];
        NSString *ctlLang = [sud valueForKey:@"ctlLang"];
        NSNumber *questionState = [sud valueForKey:@"questionState"];
        NSNumber *scoreState = [sud valueForKey:@"scoreState"];
        gameArray = (NSMutableArray *)[sud valueForKey:@"gameArray"];
        for (NSString *element in gameArray) {
            NSLog(@"\nQL gameArray value=%d\n", [element intValue]);
        }
        NSString *path = [[NSBundle mainBundle] bundlePath];
        NSString *finalPath = [path stringByAppendingPathComponent:ctlLang];
        dictionary = [NSDictionary dictionaryWithContentsOfFile:finalPath];

        NSString *sImageFile = [dictionary objectForKey:@"answerCorrect"];
        NSLog(@"%@",sImageFile);
    }
}

Печать строки работает нормально в разделе инициализации сцены. Проблема возникает в методе, который я определю позже. По какой-то причине он не возвращает строку в методе, показанном здесь:

-(void) checkAnswer: (id) sender {

    CGSize size = [[CCDirector sharedDirector] winSize];
    CCMenuItemSprite *sAnswer = (CCMenuItemSprite *)sender;
    NSLog(@"Checking Answer Tag is ---> %d",sAnswer.tag);
    NSString *sImageFile = [dictionary objectForKey:@"answerCorrect"];
    NSLog(@"%@",sImageFile);
    if ([question.answer integerValue] == sAnswer.tag) {
        //...
    }
}

Что мне здесь не хватает? программные бомбы в операторе NSLog.

Ответы [ 2 ]

5 голосов
/ 18 августа 2011

Вы присваиваете объект, возвращаемый dictionaryWithContentsOfFile:, для dictionary ivar, но не претендуете на владение им, отправляя ему сообщение retain:

dictionary = [NSDictionary dictionaryWithContentsOfFile:finalPath];

Метод dictionaryWithContentsOfFile: возвращает объект , которому вы не владеете . Возможно, к моменту выполнения checkAnswer: объект уже освобожден. Вы должны сохранить его:

dictionary = [[NSDictionary dictionaryWithContentsOfFile:finalPath] retain];

Или используйте вместо него alloc-initWithContentsOfFile:, который возвращает объект , которому вы владеете :

dictionary = [[NSDictionary alloc] initWithContentsOfFile:finalPath];

И то же самое относится к gameplay ивару. Вы не владеете объектом, возвращаемым valueForKey:, и вам необходимо сохранить его. Итак, эта строка:

gameArray = (NSMutableArray *)[sud valueForKey:@"gameArray"];

должно быть:

gameArray = [[sud valueForKey:@"gameArray"] retain];
0 голосов
/ 18 августа 2011

Я не думаю, что вы сохраняете автоматически выпущенный словарь, созданный в вашем методе init. Вы устанавливаете словарь ivar, но не сохраняете его. При последующем доступе к нему, скорее всего, он больше не действителен

...