Понимание журнала сбоя iPhone - PullRequest
0 голосов
/ 18 марта 2012

Во время игры на iPhone произошел сбой моего iPhone, и я пытаюсь понять, что произошло.

Каждый раз, когда пользователь выходит из игрового экрана, он отправляет сообщение на HomePageController (мой контроллер верхнего уровня), говорящее ему о необходимости сохранения пользовательских данных. Это работает отлично все время, за исключением этого конкретного случая. Создается исключение, утверждающее, что HomePageController не распознал селектор saveUserData, но я не вижу, как это может произойти, поскольку эта функция определенно находится в этом контроллере и работает в остальное время.

Может кто-нибудь дать совет?

Exception Type:  EXC_CRASH (SIGABRT)
Exception Codes: 0x00000000, 0x00000000
Crashed Thread:  0

Last Exception Backtrace:
0 CoreFoundation      0x3756a88f __exceptionPreprocess + 163
1 libobjc.A.dylib     0x35a70259 objc_exception_throw + 33
2 CoreFoundation      0x3756da9b -[NSObject doesNotRecognizeSelector:] + 175
3 CoreFoundation      0x3756c915 ___forwarding___ + 301
4 CoreFoundation      0x374c7650 _CF_forwarding_prep_0 + 48
5 P------k            0x0000ebe1 -[HomePageController saveUserData] (HomePageController.m:125)
6 P------k            0x00008a0b -[RootViewController viewDidAppear:] (RootViewController.m:102)

Строка 125 в HomePageController.m:

- (void)saveUserData{
    NSString *documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
                                                                   NSUserDomainMask, YES) objectAtIndex:0];
    //10x10
    {
        NSMutableDictionary *dict = [[[NSMutableDictionary alloc] init] autorelease];
        for (int i = 0; i < _puzzles10x10.count; i++){
            LevelData *currentPuzzle = [_puzzles10x10 objectAtIndex:i];
            /*(line 125)*/ [dict setObject:[currentPuzzle getPuzzleUserData] forKey:currentPuzzle.title];
        }

        [dict writeToFile:[documentsPath stringByAppendingPathComponent:@"userdata.dat"] atomically:YES];
    }
    // more here
}

Ответы [ 2 ]

3 голосов
/ 18 марта 2012

Если currentPuzzle не распознает селектор getPuzzleUserData, проблема заключается в одном из следующих:

  1. LevelData не определяет метод getPuzzleUserData.
  2. currentPuzzle не является экземпляром LevelData

Поэтому проверьте, действительно ли метод определен в классе LevelData, а не в HomePageController и что при добавлении элементов в _puzzles10x10 они фактически являются экземплярами LevelData.

Для дальнейшей отладки разбейте свой код на максимально возможное количество строк (по одной инструкции на строку), добавьте множество вызовов NSLog и посмотрите, что произойдет:

NSLog(@"_puzzles10x10: %@", _puzzles10x10);
for (int i = 0; i < _puzzles10x10.count; i++){
    LevelData *currentPuzzle = [_puzzles10x10 objectAtIndex:i];
    NSLog(@"currentPuzzle#%d: %@", i, currentPuzzle);
    UserData *userData = [currentPuzzle getPuzzleUserData]; // change UserData to the correct t class
    NSLog(@"userData#%d: %@", i, userData);
    NSString *key = currentPuzzle.title;
    NSLog(@"key#%d: %@", i, key);
    [dict setObject:userData forKey:key];
}
0 голосов
/ 18 марта 2012

Из журнала ясно, что вы вызываете метод в объекте, который на самом деле не существовал.

(2 CoreFoundation      0x3756da9b -[NSObject doesNotRecognizeSelector:] + 175)

Я думаю, что тип данных _puzzles10x10 меняется на другой тип, делаяошибки в коде.

...