了解iPhone崩溃日志

时间:2012-03-18 09:58:33

标签: iphone objective-c ios crash uikit

我的iPhone游戏在设备上崩溃,我试图了解发生了什么。

每次用户退出游戏屏幕时,它都会向HomePageController(我的顶级控制器)发送消息,告诉它保存用户数据。除了在这个特定的实例中,这一直都可以正常工作。抛出的异常似乎表明HomePageController无法识别saveUserData选择器,但我无法看到它是如何发生的,因为该函数肯定在该控制器中,并且它在其余时间工作。 / p>

有人可以提供任何建议吗?

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)

HomePageController.m中的第125行:

- (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 个答案:

答案 0 :(得分:3)

如果currentPuzzle无法识别选择器getPuzzleUserData,那么问题就是这两个问题之一:

  1. LevelData未定义方法getPuzzleUserData
  2. currentPuzzle不是LevelData
  3. 的实例

    因此,请检查方法是否在类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];
    }
    

答案 1 :(得分:0)

从日志中可以清楚地看到,你正在调用一个实际上不存在的对象中的方法。

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

我认为'_puzzles10x10'的数据类型会因代码中的错误而更改为其他类型。