ARC下的記憶體管理

2021-07-24 11:33:24 字數 2138 閱讀 7603

本文討論一下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而檔案 不支...