2012-03-18 2 views
0

Моя игра 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) 

Line 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

Можете ли вы разместить статью 125 в файле HomePageController.m? Я думаю, что вы найдете свой ответ там – giorashc

+0

@giorashc Ах да, это кажется очевидным сейчас .. Неплохо обновить вопрос, все еще не совсем уверен, почему его сбой на этой линии – Chris

+2

Строка RootViewController 102 тоже будет интересна =) –

ответ

3

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

Спасибо за Ответ, LevelData определенно отвечает на 'getPuzzleUserData'. Пользовательский код сохранения не изменился в течение нескольких месяцев, и я видел это только однажды. – Chris

+0

Все это получается нормально ... Это первый раз, когда я когда-либо видел этот крах. Я могу показать вам выбор вывода, но это точно так, как я ожидал. – Chris

+0

Если вы не можете воспроизвести сбой, тогда его трудно отладить :) так что держите журналы, пока не получите крах снова. – sch

0

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

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

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

+0

Я думаю, что это была бы возможная причина сбоя, если бы код не продвинулся вперед к линии 125. Нет? – sch

+0

Я думаю, что возможный сбой - это строка для (int i = 0; i <_puzzles10x10.count; i ++). – rakeshNS