2011-06-08 15 views
0

我所做的所有教程都說,我將所有的東西都設置爲無,在viewDidUnload中,然後在dealloc中釋放。不過,我被告知,這將導致內存泄漏,因爲viewDidUnload在dealloc之前被調用,所以我無法釋放任何設置爲零的內容。爲什麼我會看到一些代碼在viewDidUnload中發佈的東西,而不是dealloc?

有人可以澄清?

+0

可能的重複[什麼時候應該釋放對象在 - (void)viewDidUnload而不是在-dealloc中?](http://stackoverflow.com/questions/1158788/when-should-i-release-objects- in-voidviewdidunload-rather-in-dealloc) – PengOne 2011-06-08 04:31:49

回答

4

如果你創建一個對象(allocinit)在viewDidLoad,那麼你應該在viewDidUnloadrelease它。原因是有時調用viewDidUnload來節省內存,但不調用dealloc。然後,以後可能再次調用viewDidLoad。一般而言,以反向方法釋放你分配的任何東西,例如

如果您分配init中的對象,然後將其釋放到dealloc

如果您在viewDidLoad中分配了一個對象,然後在viewDidUnload中釋放它。

如果分配在viewWillAppear(或viewDidAppear)的對象,然後在viewWillDisappear(或viewDidDisppear)釋放它。

+0

+1,Bang on ....很好的回答.. – visakh7 2011-06-08 04:31:44

+0

iboutlets或者屬性怎麼樣?任何特殊規則? – jini 2011-06-08 04:44:24

0

看看@Sean在此前的SO question給出的答案。他明確指出釋放的viewDidUnload

其中一個最重要的原因的宗旨,爲實現 它是 的UIViewController子類通常 也包含在視圖 層次擁有以 各種子視圖引用。這些屬性可能有 通過IBOutlets設置,當從一個筆尖加載 或 以編程方式在-loadView內部時,對於 實例。

通過的UIViewController子視圖 的附加所有權意味着 即使當它的視圖被從 視圖層次結構中移除並釋放到保存 存儲器,通過其子視圖 也由視圖釋放時,它們將 不實際上被釋放,因爲 UIViewController本身仍然包含它自己的優秀保留 對這些對象的引用。 釋放UIViewController的 這些對象的附加所有權 確保它們將被釋放爲 以釋放內存。

,你在這裏釋放的對象是 通常重建,並重新設置時 的UIViewController的觀點是 重新加載,無論是從筆尖或 通過 -loadView的實現。

另請注意,在調用此 方法時,UIViewController的 視圖屬性爲零。

相關問題