記憶體管理劄記

來源:互聯網
上載者:User

1、引用計數

retain :將一個對象的reference數量增加1。

release:將一個對象的reference數量減少1。

autorelease:在未來某些時候將reference數量減少1.

alloc:為一個對象分配記憶體,並設定保留值數量(retain count)為1

copy:複製一個對象,並將其做為傳回值。同時設定保留值數量(retain count)為1

2、uiviewcontroller生命週期

viewDidUnload :收到記憶體警告時自動調用除當前正在展示的 view 所屬 viewController 以外所有已經在記憶體裡面的 viewController 執行 viewDidUnload 方法,而不是當前 viewController 執行 viewDidUnload,當然,這些 viewController 不會被 dealloc。所以在 viewDidUnload 裡面一般都是釋放 IBOutlet 變數和在 viewDidLoad、viewWillAppear、viewDidAppear 等方法能夠重建的資料。而由其他頁面傳遞過來的資料或者無法經過 viewDidLoad、viewWillAppear、viewDidAppear 等方法重建的資料則不能釋放,舉例子說如果在 navigationController 由上一個頁面傳遞過來的一張圖片,在 viewDidUnload 裡被釋放的話,則當 view 再次載入的時候就無法恢複了。

那為什麼要寫成 self.myOutlet = nil; ,實際上這個文法是執行了 property 裡的setter 方法,而不是一個簡單的變數賦值,它幹了兩件事:1、老資料 release 掉,2、新資料(nil)retain(當 property 設定為 retain 的情況下),當然對 nil retain 是無意義的。如果寫成 myOutlet = nil,那就是簡單的把 myOutlet 指向 nil,這樣記憶體就泄漏了,因為老資料沒有 release。而如果僅僅寫成 [myOutlet release] 也會有問題,因為當 view 被 dealloc 的時候會 再次 release,程式就出錯了,而對 nil release 是沒有問題的。

dealloc 是當前 viewController 被釋放的時候,清空所有當前 viewController 裡面的實體和資料來釋放記憶體,該方法也是自動調用的,無需手動執行。舉例說明當 modalView 被 dismissModalViewControllerAnimated 或者 navigationController 回到上一頁的時候,這個方法就會被自動調用。因為這個頁面已經不再使用了,所以可以把所有實體和資料都釋放(release)掉。 

其實兩者最大的區別就是: viewDidUnload 是記憶體除當前以外所有 viewController 同時執行,而 dealloc 只是當前 viewController 執行。這個是網上的材料沒有說明的。

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.