2012-05-10 12 views
0

簡單的問題提醒,但我想確定我不是愚蠢的。在Objective-C中刪除動態創建的對象時,我應該設置爲零?

在我的iPad應用程序中,我動態地創建了一個UIView,並用UIButtons,UIImageViews,有時是MPMoviePlayerController,有時是一個帶有幾個UIImage的UIImageView作爲動畫。

經過一段時間後,我從屏幕上刪除視圖並丟棄它。

現在的問題是:我應該將這些對象中的任何一個設置爲零嗎?

我在分配它之後釋放所有東西,我沒有發現任何泄漏。但是我的應用程序在內存不足後最終崩潰。我建立的這些觀點中的每一個似乎都潛伏在記憶中的某個地方。

任何幫助,非常感謝。

Duncs

+0

將斷點添加到類dealloc方法和檢查。當你認爲他們真的被釋放了嗎? –

+0

這是所有在UIViewController中運行的,所以沒有調用dealloc方法(直到用戶關閉了UIViewController,但在此之前應用程序崩潰)。 – theDuncs

回答

4

如果沒有代碼或者不知道你是否使用ARC,很難評論(猜測不是,因爲你說的「釋放」)。

  1. 做一個分析和解決它標記的每個問題。它很好地告訴你,如果你保留/釋放正確
  2. 使用泄漏儀器找到泄漏
  3. 如果你沒有更多的泄漏,但仍然崩潰,然後打開殭屍,並確保你沒有釋放任何過早

設置一個變量爲零不會做任何事情來釋放內存。如果你有一個的@property聲明,自動生成的setter將這樣設置屬性爲零將釋放舊值。

任何具有屬性的類的dealloc都需要對指向保留對象的所有屬性執行此操作。對於UIViewControllers,您還可以在viewDidUnload中爲IBOutlet屬性執行此操作。

+0

謝謝盧。沒有ARC,沒有泄漏,沒有殭屍。而且我的動態對象都不是@properties。我現在要做一個分析,看看是否會帶來什麼 - 但我會接受你的答案,因爲你已經解釋了我不需要設置任何東西到零。 – theDuncs

1

當您使用ARC,當你添加UIView作爲另一UIView子視圖,保留計數將增加。在你「removeFromSuperview」它,它會減少,它將被釋放。在Non-Arc環境中,分配它並將其添加到UIView中後,retain將爲2,但隨後釋放它,因此它將回到1.所以它們之間始終保持平衡。要檢查發生了什麼,您應該使用儀器來查明問題。


只有當你有一個@屬性的iVar(保留)時,它纔有意義。這是爲什麼?因爲它會釋放舊值,並將新值設置爲傳遞的值(在這種情況下爲零)。您可能認爲該問題與UIViews有關,但可能是其他內容。這就是爲什麼我建議你使用儀器。

+0

謝謝Jacky Boy。我沒有使用ARC,我正在釋放一切。問題是:我應該設置什麼零?我是否需要將UIImageViews設置爲零或UIImageViews中的UIImage爲零?或者我的版本會爲我處理所有這些? – theDuncs

+0

看我的編輯.... – Peres

+0

謝謝隊友。當我使用儀器時,我沒有發現任何泄漏,但是我的總分配不斷上升。 – theDuncs

相關問題