2009-08-23 69 views
0

我有一個tableviewcontroller,我從sqlite數據庫中填充一些數據,併爲每一行從http服務器下載一個文件並在本地緩存它。我只在「detailsview」打開時才緩存它。在文件下載完成後,detailsview通過委託迴應該表。目標中的內存管理問題C

但是,當這種tableview中本身彈出的navicontroller的,調用委託失敗了EXEC_BAD_ACCESS

我打電話的細節查看setDelegate [_delegate保留],一切工作正常,但我'不知道這是否會泄漏內存...

任何人都可以建議嗎?

回答

2

您的委託過早發佈,並且向無效對象發送消息將調用EXEC_BAD_ACCESS。保留它可以解決問題,但通常最好不要讓對象保留其委託,因爲存在保留週期的可能性,所以您可能需要重新考慮您的結構。如果您在視圖解除分配時釋放委託,則除非您還將該委託保留在setDelegate:中,否則需要將其刪除。

2

通常,不保留代表以避免保留週期。如果委託人可能在您面前被釋放,那麼委託人有責任在完成解除分配之前清除您的參考(例如在其dealloc中)。但是,如果有任何屬性設置爲「保留」或「複製」,那麼您將保留/將其複製到setter中(或使用@synthesized setters將爲您執行),然後將其釋放到dealloc中避免泄漏。如上所述,這可能會導致一個保留週期,以便兩個對象都不會被釋放。

我建議你打開一些內存調試環境變量NSZombieEnabled和NSAutoreleaseFreedObjectCheckEnabled,看看它是否告訴你哪個對象正在釋放。