2012-07-11 43 views
0

我的應用程序崩潰在dealloc,但只是有時。應用程序在dealloc崩潰

我創建了一個用於緩存5個對象的數組。當用戶點擊右側或左側時,會添加一個新對象並刪除最後一個對象。當我測試應用程序時,點擊右側或左側按鈕100-500次,應用程序崩潰。

該應用程序在dealloc方法崩潰,但所有對象分配和正確釋放。

dealloc方法:

- (void)dealloc 
{ 
    [super dealloc]; 
    [_sImageLane release]; 
    [_sTipoLane release]; 
    [_maRecomended release]; 
    [_maProdcucts release]; // here crash in this line EXC_BAD_ACCESSE 
} 

到底哪裏出問題了?

回答

8

[super dealloc]最後而不是第一。

編輯:發生這種情況的原因是由於objc對象的生命週期。當它是死的時候,對象被髮送dealloc消息。在該方法內部,對象必須自行清理,並將消息傳遞給繼承鏈(因爲超類也需要自行清理)。那麼,如果你在[super dealloc]最後一次正確地做到這一點,會發生什麼?

清理自我資源 - >清理超級資源 - >清理super超級資源 - > etc - >運行時回收內存。

不錯,好吧,如果你這樣做,會發生什麼?在超級

清理資源 - >清理上超級的超級資源 - >等 - >內存運行時回收 - >清理自我

哎呀資源,現在您正在訪問回收的存儲器並試圖與它交互(即EXC_BAD_ACCESS或更糟糕的是,在另一個對象的其他地方弄亂了內存,而沒有意識到它)。

NSObject的dealloc方法從字面上釋放內存(可能通過free()),所以一旦你調用了你處於未定義的危險灰色區域。

+0

謝謝@borrden我要證明這一點,我會注意到你。 – NTTake 2012-07-11 03:27:45

+0

上帝的母親這是解決我的問題,謝謝@borrden,但爲什麼?爲什麼叫超級最後?謝謝 – NTTake 2012-07-11 03:42:59

+0

@NTTake我會用解釋編輯我的答案。 – borrrden 2012-07-11 03:45:08

0

你使用的是什麼版本的Xcode?新版本不要求您分配或釋放內存。它爲你來運行。嘗試註釋掉dealloc方法,然後編譯。

+0

如果OP沒有使用ARC,那麼註釋'[super dealloc]'可能會修復崩潰,但會導致內存泄漏。我懷疑@borrrden有正確的答案。 – mttrb 2012-07-11 03:25:03

+0

不完全正確。您必須明確啓用ARC。在新版本的XCode上創建的新項目默認已啓用,但較早的項目必須啓用它。 – sosborn 2012-07-11 03:26:15

+0

不,我不使用弧這不是一個選項謝謝。 – NTTake 2012-07-11 03:28:32