ARC 記憶體管理解惑

2021-07-10 13:16:57 字數 1434 閱讀 5497

自動引用計數(arc)是乙個編譯器特性,它提供了自動的objective - c物件的記憶體管理。arc是通過在編譯時新增**來確保oc物件只在需要的時候存在。從概念上講,它新增適當的記憶體管理呼叫,並且遵循手動引用計數的記憶體管理規範。因此,在使用arc時,不用關心什麼時候使用retain,release 和 autorelease,並且arc也不是直接傳送retain等oc訊息,而是直接呼叫runtime的c函式,以獲得更高的效率。

property為你的成員變數生成setter 和 getter, 在生成時,對於不同的變數,肯定會有不同的管理方式,因此不能一概而論。於是就需要使用atomic,nonatomic, strong, retain, weak, assign, copy, readonly, readwrite來設定不同的變數的管理方式。其中atomic和nonatomic很好理解,決定變時是否是執行緒安全的。 readonly和readwrite也好理解,決定其可讀寫性。剩下的strong, retain, weak, assign, copy和setter相關。

需要注意的是,只有在通過點格式(obj.var)訪問變數時,這些屬性才會有效果。

self.name = something;  //正確的方式

_name = something; //會繞開setter, 直接訪問變數

strong和weak是arc中新增的property屬性,strong用於表明對物件的強引用,讓其保持在記憶體中,直到不再指向它,其作用與retain完全相同,不過用意似乎更明確了。而weak 則不具備讓物件保持在記憶體中的權利,當不再有strong指向weak指向的物件時,物件會被釋放。

assign 和 weak的區別在於,當weak指向的物件被釋放時,weak會指向nil, 而assign則不會這麼做。

在使用copy時,setter傳入的物件會被拷貝,並strong指向拷貝的物件。使用copy可以確保傳入的物件不被外部修改。並且如果使用了copy,但物件沒有被修改,會被優化成strong(未證實)。

雖然arc能自動管理記憶體,但不恰當的使用也會導致記憶體洩漏。最常見的就是迴圈強引用。主要有以下幾種情況:

- outlet型別指標

- 委託

- block

outlet和委託可以可以將其宣告為weak來避免迴圈引用。

對於block,可以使用@weakify 巨集:

@weakify(self);  

dispatch_async(dispatch_get_global_queue(dispatch_queue_priority_default, 0), ^);

在arc工程中,使用strong 來代替retain,對原始的c語言變數使用assign,對oc物件的弱引用使用weak,對防止被外部修改的物件使用copy,另外,當需要宣告乙個block變數時,也應該使用copy。

iOS記憶體管理 ARC

arc是在編譯的時候插入 來確信讓物件能夠按需要來存在。arc同樣是以引用計數為基礎。你可以選擇在以檔案或者專案為單位不使用arc。但是建議盡量最好使用arc,首先,編譯器為你做記憶體管理往往比你自己要更優秀,其次,arc導致的效率損失在ui面前基本可以忽略不計。arc有以下強制規則 1.你不能顯示...

ARC 記憶體管理見解

arc就是自動引用計數,在arc之前,我們都是通過手動管理引用計數的,也就是手動使用release和retain來是引用計數減1或者加1,arc其實還是使用release和retain,只不過系統幫你完成而成。clang語1言擴充套件很有強的類函式巨集,可以使用以下 宣告編譯時支援arc而檔案 不支...

OC記憶體管理之ARC

除了特殊場合,使用arc是大勢所趨。因為這不僅能夠提高程式設計師的開發效率,讓程式設計師把精力專注在功能實現上,也大大節約了專案的開發成本,更提高了程式的可維護性。1.使用arc的重要關注點就是 物件是否有強指標指向,沒有強指標指向的物件會被系統自動 2.property關鍵字 強指標用strong...