2011-04-20 98 views
2

有些東西我沒有在Apple文檔中找到。下面是來自摘錄 - UIViewController類的(無效)viewDidUnload:爲什麼要設置爲零並釋放UIViewController的屬性?

您的dealloc方法應該釋放 每個對象,但還應該設置 引用該對象零 之前調用超。

如果使用保留和代碼中的XXX屬性的synthetize,爲什麼大多數的蘋果的例子做了一套對零在viewDidUnload:

self.xxx = nil; 

但recommands做兩件事一組到零,釋放在的dealloc:

[xxx release]; 
self.xxx = nil; 

爲什麼設定到零不夠的dealloc的?

PS:我知道我的問題是非常相似,這一個"Why release a property that you've already set to nil?"但它是不完全一樣

回答

4
[xxx release]; 
self.xxx = nil; 

這是錯誤的,因爲XXX將得到釋放兩次,推薦的方法是釋放伊娃並將其設置爲nil ,不使用屬性:

[xxx release]; 
xxx = nil; 

其原因不只是使用

self.xxx = nil; 

是調用setter方法可能有一些副作用,可能會導致dealloc方法中的問題(即,使用其他一些可能已經釋放的iVar)

+0

感謝您的回答。這是否意味着如果100%確定在setter方法中沒有副作用(例如當合成的方法沒有被覆蓋時),我們可以使用self.xxx = nil作爲釋放內存的唯一調用? – 2011-04-20 14:48:50

+0

我們可以,但是仍有很小的機會,setter實現將在未來發生變化並引入副作用......但在大多數情況下,self.xxx = nil應該可以正常工作 – Vladimir 2011-04-20 14:55:30

+0

非常感謝弗拉基米爾! – 2011-04-20 21:45:32

相關問題