[ios 開發筆記]:viewDidUnload和dealloc的執行時機

weixin_34119545發表於2012-06-03

一直對這個沒有什麼問題,反正就是瘋狂的release。但今天發現原來模擬器可以模擬記憶體不足時的情況,這使我的程式發生了一些錯誤,同時也讓我對這兩傢伙瞭解更多。

 
viewDidUnload
這個只在記憶體不足時執行,而且是對所有非當前顯示的controller執行。你可以通過模擬器執行:硬體》模擬記憶體警告 來觸發。
當己經執行viewDidUnload的controller重新顯示時,會重新執行viewDidLoad。比如A push B》引發記憶體警告(A自動執行viewDidUnload)》pop B(這時A重新執行viewDidLoad)。
 
dealloc 
當對像被銷燬時執行。
比如:

A a=[[A alloc]init];

[a release];//此時,A執行dealloc ,但並不會執行viewDidUnload


由此可見,viewDidUnload和dealloc 執行並沒有順序上的關係。
 
然後可能還有個疑問,為什麼看到通常情況下是這樣的:
 
viewDidUnload裡面

 

 

    self.outView=nil;
    self.loaddingIcon=nil;

而在dealloc裡面

 

[_outView release];
[_loaddingIcon release];

 

關於這兩個種操作的區別,請看我上一篇筆記《[ios 開發筆記]:@property和成員變數 》

 

將一個指標設為nil,是為了防止因訪問一個己釋放的對像,程式crash掉,而對空指標發訊息則會返回0,不會引發crash。

想想上面的的例子,當一個對像執行viewDidUnload時,如果僅僅對成員release,而當其它地方對其訪問時,由於指標指向的地址的對像己經release,程式直接crash。

但當一個對己經dealloc,則不存在這種crash可能性,因此,不置nil效率更高。

 

說到這裡,應該可以理解他們裡面應該放些什麼。

 

正如網上說viewDidUnload可以釋放一些容易重新構建的東西,比如本地的圖片之類的,當然在viewDidLoad裡必須重新構建。

 

而對於不易重新構建的東西,如重新從伺服器下載的資料,則可以放在init裡構建,viewDidUnload就不要將其釋放了。

相關文章