2012-03-18 247 views
0

我的iPhone遊戲在設備上崩潰,我試圖瞭解發生了什麼。瞭解iPhone崩潰日誌

每次用戶退出遊戲畫面,它都會發送一條消息給HomePageController(我的頂級控制器),告訴它保存用戶數據。除了在這個特殊情況下,這一切都可以正常工作。拋出的異常似乎表明,HomePageController沒有識別出saveUserData選擇器,但我不明白這是如何發生的,因爲該功能絕對在該控制器中,並且在其餘時間內工作。

任何人都可以提供任何建議嗎? 125

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:

- (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

你可以在你的HomePageController.m文件中發佈什麼是125行嗎?我想你會在那裏找到你的答案 – giorashc 2012-03-18 10:04:19

+0

@giorashc啊,是的,現在看起來很明顯..更新問題,仍然不完全確定爲什麼它在該行崩潰 – Chris 2012-03-18 10:07:04

+2

RootViewController的102行也會很有趣= = – 2012-03-18 10:37:25

回答

3

如果currentPuzzle無法識別選擇getPuzzleUserData那麼問題是這兩種中的一種:

  1. LevelData沒有定義方法getPuzzleUserData
  2. currentPuzzle不是LevelData

實例添加內容時要_puzzles10x10他們實際上的LevelData實例,以檢查方法是在類LevelData並沒有真正定義的HomePageController和。

爲了進一步調試,拆你的代碼一樣多的行可能的(每行一個命令),增添了不少的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 2012-03-18 10:22:32

+0

這一切都得到輸出好吧...這是我第一次看到這種崩潰發生。我可以給你看一個輸出的選擇,但它完全如我所料。 – Chris 2012-03-18 10:37:21

+0

如果你不能重現崩潰,那麼很難調試它:)所以保持日誌,直到你再次崩潰。 – sch 2012-03-18 10:49:22

0

從日誌很顯然,你在對象中調用一個並不存在的方法。

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

我認爲`_puzzles10x10'的數據類型由於在代碼中出錯而改變爲某種其他類型。

+0

我認爲如果代碼沒有前進到第125行,這可能是崩潰的原因。不是嗎? – sch 2012-03-18 10:29:08

+0

我認爲可能的崩潰是在(int i = 0; i <_puzzles10x10.count; i ++)本身的行中。 – rakeshNS 2012-03-18 10:35:04