天天看點

objective-c 文法快速過(7)編譯器特性ARCARC基本原理(不是類似 java 的垃圾回收機制)ARC 的規則非常簡單:隻要還有一個強指針變量指向對象,對象就會保持在記憶體中

arc(是編譯器特性)

arc是自ios 5之後增加的新特性,完全消除了手動管理記憶體的煩瑣,編譯器會自動在适當的地方插入适當的retain、release、autorelease語句。你不再需要擔心記憶體管理,因為編譯器為你處理了一切

arc 是編譯器特性,而不是 ios 運作時特性,它也不是類似于其它語言中的垃圾收集器。是以 arc 和手動記憶體管理性能是一樣的,有時還能更加快速,因為編譯器還可以執行某些優化

強指針和弱指針

預設所有執行個體變量和局部變量都是strong指針

弱指針指向的對象被回收後,弱指針會自動變為nil指針,不會引發野指針錯誤

arc的判斷準則:隻要沒有強指針指向對象,就會釋放對象,弱指針不會這樣,及時有弱指針指向對象,對象沒有強指針指向,也會自動釋放掉。一般,無需顯式聲明為強指針,但是在封裝裡,定義方法的時候需要寫明。而弱指針,必須顯式說明。預設是強指針。

arc特點

 1> 不允許調用release、retain、retaincount

 2> 允許重寫dealloc,但是不允許調用[super dealloc]

 3> @property的參數

  * strong :成員變量是強指針(适用于oc對象類型)

  * weak :成員變量是弱指針(适用于oc對象類型)

  * assign : 适用于非oc對象類型

 4> 以前的retain改為用strong

oc的指針分2種:

 1> 強指針:預設情況下,所有的指針都是強指針 __strong

 2> 弱指針:__weak

objective-c 文法快速過(7)編譯器特性ARCARC基本原理(不是類似 java 的垃圾回收機制)ARC 的規則非常簡單:隻要還有一個強指針變量指向對象,對象就會保持在記憶體中
objective-c 文法快速過(7)編譯器特性ARCARC基本原理(不是類似 java 的垃圾回收機制)ARC 的規則非常簡單:隻要還有一個強指針變量指向對象,對象就會保持在記憶體中

重構舊代碼(手動記憶體管理重構為 arc 方式)xcode6

objective-c 文法快速過(7)編譯器特性ARCARC基本原理(不是類似 java 的垃圾回收機制)ARC 的規則非常簡單:隻要還有一個強指針變量指向對象,對象就會保持在記憶體中

這樣操作之後,可以把非 arc 項目,轉換為 arc 項目。

如何檢視項目是否是 arc?

在 build settings 裡搜尋 auto,看選項:

objective-c 文法快速過(7)編譯器特性ARCARC基本原理(不是類似 java 的垃圾回收機制)ARC 的規則非常簡單:隻要還有一個強指針變量指向對象,對象就會保持在記憶體中

如何使得 arc 和非 arc 在一個項目共存?

經常需要使用第三方架構,或者一些其他的舊代碼,那麼有支援 arc 的,也有不支援的,怎麼辦呢?可以這樣設定:在編譯選項裡

objective-c 文法快速過(7)編譯器特性ARCARC基本原理(不是類似 java 的垃圾回收機制)ARC 的規則非常簡單:隻要還有一個強指針變量指向對象,對象就會保持在記憶體中

輕按兩下需要非 arc的檔案,如下設定:

-fno-objc-arc

這樣這個檔案就能使用 retain ,release,autorelease等關鍵字

-f 代表 flags 标記的意思,固定寫法。

反過來,對于非 arc 項目,這樣設定:

-f-objc-arc

arc使用注意

不能調用release、retain、autorelease、retaincount

可以重寫dealloc,但是不能調用[super dealloc]

@property : 想長期擁有某個對象,應該用strong,其他對象用weak

其他基本資料類型依然用assign

兩端互相引用時,一端用strong、一端用weak

同樣,在 arc 項目裡,也有循環雙端引用的現象,你 strong 我,我 strong 你的情況。解決辦法照舊。兩端互相引用時,一端用strong、一端用weak

objective-c 文法快速過(7)編譯器特性ARCARC基本原理(不是類似 java 的垃圾回收機制)ARC 的規則非常簡單:隻要還有一個強指針變量指向對象,對象就會保持在記憶體中
objective-c 文法快速過(7)編譯器特性ARCARC基本原理(不是類似 java 的垃圾回收機制)ARC 的規則非常簡單:隻要還有一個強指針變量指向對象,對象就會保持在記憶體中

否則,同樣是報錯,比如都使用 strong 屬性

記憶體布局:

objective-c 文法快速過(7)編譯器特性ARCARC基本原理(不是類似 java 的垃圾回收機制)ARC 的規則非常簡單:隻要還有一個強指針變量指向對象,對象就會保持在記憶體中

p.dog = d;//把dog對象指派給 person 對象裡的_dog,指針,是個強指針。

d.person = p;//同樣,dog 對象裡的_person 強指針指向了 person 對象

objective-c 文法快速過(7)編譯器特性ARCARC基本原理(不是類似 java 的垃圾回收機制)ARC 的規則非常簡單:隻要還有一個強指針變量指向對象,對象就會保持在記憶體中

當程式執行完畢,或者說 main 函數執行完畢,自動變量銷毀

objective-c 文法快速過(7)編譯器特性ARCARC基本原理(不是類似 java 的垃圾回收機制)ARC 的規則非常簡單:隻要還有一個強指針變量指向對象,對象就會保持在記憶體中

因為都是強指針,發生如上情況,記憶體洩露。故__weak 或者 weak 屬性一般用在循環引用的場合,其他場合不多見。

辛苦的勞動,轉載請注明出處,謝謝……

http://www.cnblogs.com/kubixuesheng/p/4314426.html

繼續閱讀