本文討論一下arc(automatic referencing count)下的記憶體管理問題
例項變數是類的私有成員變數,無法被外部訪問,並且子類無法繼承。
屬性以@property修飾,是封裝了getter/setter方法的「成員變數」,可以被外部訪問和被繼承。宣告屬性後,系統會生成乙個名為_property的變數。
在.m中可以使用self.property 或者_property讀寫屬性,兩者的區別是:前者會呼叫系統/自定義的getter/setter方法,後者只是對_property的操作。
注意:
正因為_property = object;這樣的操作並不會掉用setter方法,所以如果屬性property被定義為copy,而且object又實現了深拷貝時,就無法實現深拷貝的效果。例如:
.h中定義:
@property (nonatomic, copy) nsstring *strcopy;
.m中實現:
nsmutablestring *string = [nsmutablestring stringwithformat:@」abc」];
_strcopy = string;
if (_strcopy == string)
else
self.strcopy = string;
if (_strcopy == string)
else
輸出結果是:
2016-11-09 13:43:02.389 test[3995:380720] this is a shallow copy
2016-11-09 13:43:02.390 test[3995:380720] this is a deep copy
一句話說明:用strong修飾屬性,只是屬性的引用計數加1,copy修飾屬性的話,會在setter函式中掉用該屬性物件的copy方法。像集合型別:nsarray, nsset的copy方法,只是指標賦值的淺拷貝。非集合型別
tables
集合類(陣列、集合)
非集合類
操作不可變物件
淺拷貝淺拷貝
操作可變物件
深拷貝深拷貝
集合類:array,set
不可變物件:nsarary nsset
可變物件:nsmutablearray, nsmutableset
例如:nsstring,是非集合類不可變物件,是淺拷貝。
assign : 直接賦值,一般來修飾基本資料型別。
weak : 修飾objc物件,set時不保留新值,也不釋放舊值,只設定新值。
assign與weak的不同是assign使用後並沒有將指標賦值為nil,可能出現野指標(如何出現?);
weak會將指標賦值為nil。
非arc中的block型別有:
1,_nsconcreteglobalblock 全域性的靜態 block,不會訪問任何外部變數。
2,_nsconcretestackblock 儲存在棧中的 block,當函式返回時會被銷毀。
3,_nsconcretemallocblock 儲存在堆中的 block,當引用計數為 0 時會被銷毀。
arc中只有1,3兩種。
我們需要防止下面這種情況:由於記憶體屬性設定不當,導致block變數成為野指標,然後執行block時,會出現崩潰。
例如將block的屬性設定成為assign,會導致這種情況的發生。
結論:
在非arc中,需要用copy修飾,將block建立到堆上面。
在arc中,用retain或者copy修飾都可以,但是會提示用copy修飾的warning。
1,由於block會對內部的變數進行強引用,所以在block內部對於增加引用計數的外部變數需要使用其__weak版本。
2,關於block內部對外部變數的訪問方式。對於外部變數的訪問方式通常是唯讀方式,只有增加了__block修飾的外部變數才可修改。
1,readwrite/readonly
2,assign/retain/strong/copy/weak
3,atomic/nonatomic
參考:
1,2,block內部實現原理(一)
非ARC模式下記憶體管理總結
如果我們不使用arc來自動管理記憶體,那麼則應該記住以下準則 1.對於臨時物件 a.通過alloc new copy獲得的物件,應該在不再使用時釋放該物件 release b.通過其他任何方法獲得的物件,我們假設該物件的retaincount為1,且被設定為自動釋放物件,因此我們不需要做任何事情 2...
iOS記憶體管理 ARC
arc是在編譯的時候插入 來確信讓物件能夠按需要來存在。arc同樣是以引用計數為基礎。你可以選擇在以檔案或者專案為單位不使用arc。但是建議盡量最好使用arc,首先,編譯器為你做記憶體管理往往比你自己要更優秀,其次,arc導致的效率損失在ui面前基本可以忽略不計。arc有以下強制規則 1.你不能顯示...
ARC 記憶體管理見解
arc就是自動引用計數,在arc之前,我們都是通過手動管理引用計數的,也就是手動使用release和retain來是引用計數減1或者加1,arc其實還是使用release和retain,只不過系統幫你完成而成。clang語1言擴充套件很有強的類函式巨集,可以使用以下 宣告編譯時支援arc而檔案 不支...