一直對這個沒有什麼問題,反正就是瘋狂的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就不要將其釋放了。