2011-01-21 160 views
1

我的iOS應用程序已與一些用戶崩潰。我能夠回收他們的崩潰日誌並對它們進行符號化。雙釋放會導致崩潰嗎?

幾乎每次崩潰看起來像這樣...

0 libobjc.A.dylib    0x34a80466 objc_msgSend + 18 
1 CoreFoundation     0x357e0f74 -[NSObject(NSObject) release] + 24 
2 CoreFoundation     0x357e53c2 CFRelease + 62 
3 CoreFoundation     0x35825fe6 -[__NSArrayM removeObjectAtIndex:] + 82 
4 CoreFoundation     0x358237ae -[NSMutableArray removeAllObjects] + 30 
5 [appName]      0x00006396 -[MainView actionSheet:clickedButtonAtIndex:] (MainView.m:790) 

正如你可以在2和1,我的數組被釋放兩次看到。第二次發佈後,應用程序發送objc_msgSend和應用程序崩潰。它是否因爲陣列被釋放兩次而崩潰?

而且,我的陣列中創建這樣的:

someArray = [[NSMutableArray alloc] init]; 

我只是在我的dealloc釋放這個數組是這樣的:

- (void)dealloc { 

[someArray release]; 

} 

至於結果,我只能釋放一次,在我dealloc,它怎麼會因爲被釋放兩次而崩潰?

最後,關於這個崩潰的另一個奇怪的是它只是有時會發生,這是不相符的。正如您在崩潰日誌的第5行中看到的那樣,按下了一個操作表按鈕。只有一個上按執行行:

[someArray removeAllObjects]; 

這個崩潰已經讓我完全摸不着頭腦,我將不勝感激,如果有人可以幫助我準確理解爲什麼它的崩潰,我怎麼能阻止它的崩潰未來。

在此先感謝!

回答

0

這看起來並不像發送到您的陣列釋放消息 - 這看起來像發送到你的陣列的內部存儲對象中的一個釋放消息。

如果我正確地理解了這一點,您將從數組中刪除一個對象,然後它會被釋放,然後系統會嘗試向該對象發送消息。

2

它看起來像一個雙釋放,但它可能是數組中的一個對象,而不是數組本身。爲了追蹤它,在Xcode的殭屍工具下運行你的應用程序。最好在模擬器中這樣做,因爲這會佔用大量內存。現在當你重現崩潰時,你會發現哪個類是有問題的對象。您還可以跟蹤其保留/發佈歷史記錄,以查明您打破它的位置。