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

來源:互聯網
上載者:User

一直對這個沒有什麼問題,反正就是瘋狂的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掉,而對null 指標發訊息則會返回0,不會引發crash。

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

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

 

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

 

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

 

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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.