08.內存管理


手動內存管理
什麼是內存管理

.進程空間
-代碼區:只讀
 -堆:自己創建、自己回收釋放,對象是保存在堆區的。
-全局區:進程啓動時候分配,進行結束時釋放。
-棧:局部變量,自動創建,自動釋放空間
.什麼是內存管理
-只要對堆內進行管理,所謂的管理是值內存的分配(創建)和釋放(回收).

引用計算器爲1(alloc,copy,new)
.引用計算器爲1(alloc,copy,new)
-每個對象都有自己的引用計數器,引用計算器是用來計算對象被引用的次數
-發送消息時(alloc,copy,new),將引用計數器置1。

assign關鍵字
-retain如果屬性是對象,就會使用此關鍵字,解決內存問題
-asssign如果屬性是基本數據類型,默認’就是assign,不會解決內存問題。
-copy一些特殊對象類型,如果不希望和比人共享一個對象用copy會自動創建一個新的對象。
-readonly 只讀,去掉setter,只保留getter
-weak,用於一些基本控件

引用計數器加1(retain)
.引用計數器加1(retain)
當你需要使用一個別人創建好的對象時,爲了防止在使用此對象期間別人釋放了這個對象,我們要將此對象的引用計算器加1(程序員通知引用計數器),只要給對象發送retain消息,引用計數器就會加1.

引用計數器減1(release)
引用計數器減1(release)
-當你使用的對象不在使用的時候,就發送release消息
-release消息將對象的引用計數器減1
-如果引用計數器爲0,則釋放對象所佔的存儲空間

dealloc與對象銷燬
.dealloc與對象銷燬
-當對象的引用計數器爲0時,說明已經沒有任何引用指向對象,對象就會被系統自動銷燬
-系統銷燬對象之前,會自動向對象發送一條消息“dealloc”消息,對象所佔的空間就會被釋放,千萬不要自己去調用dealloc消息
.可以使用“retainCount消息“,查看當前引用計數器的值。

.野指針與空指針
.野指針與空指針
-當你指向的對象,不在使用時,如果忘了發送release消息,內存泄露(資源浪費)
-當引用指向的對象已經不存在了,繼續向對象發送消息,會發生問題,如異常,crash
-沒有相應內存空間的指針,野指針
-會使用空指針,解決指針問題,而在oc中,向空指針發送消息,是不會報錯的stu = nil;


聲明式屬性與內存管理
.聲明式屬性與內存管理
-注意:聲明屬性默認情況下,並沒有解決內存問題
-當使用@property(retain)引用數據類型,幫我們解決了setter使用中內存問題,但dealloc中的release操作,還是需要我們自己來做的。


atomic與nonatomic
.atomic與nonatomic
-nonatomic非原子性操作,安全性低,效率高。
-atomic 原子性操作,在多線程使用的時候,一般是用來防止寫未完成的時候,被另一個線程讀取,造成數據安全性問題,這種操作消耗資源的。

自動釋放池
什麼是自動釋放池
通過釋放池來管理對象,只需要一個自動釋放池,可以管理很多對象,但自動釋放池結束的時候,會自動向池中的每個對象發送release消息




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章