arc是什麼
arc是ios 5推出的新功能,全稱叫 arc(automatic reference counting)。簡單地說,就是**中自動加入了retain/release,原先需要手動新增的用來處理記憶體管理的引用計數的**可以自動地由編譯器完成了。
該機能在 ios 5/ mac os x 10.7 開始匯入,利用 xcode4.2 可以使用該機能。簡單地理解arc,就是通過指定的語法,讓編譯器(llvm 3.0)在編譯**時,自動生成例項的引用計數管理部分**。有一點,arc並不是gc,它只是一種**靜態分析(static analyzer)工具。
變化點
通過一小段**,我們看看使用arc前後的變化點。
@inte***ce nonarcobject : nsobject
-(id)initwithname:(nsstring *)name;
@end
@implementation nonarcobject
-(id)initwithname:(nsstring *)newname
return self;
}
-(void)dealloc
@end
@inte***ce arcobject : nsobject
-(id)initwithname:(nsstring *)name;
@end
@implementation arcobject
-(id)initwithname:(nsstring *)newname
return self;
} @end
我們之前使用objective-c中記憶體管理規則時,往往採用下面的準則
而使用arc後,我們可以不需要這樣做了,甚至連最基礎的release都不需要了。
使用arc的好處
使用arc有什麼好處呢?
不好的地方
arc基本規則
由於arc並不是gc,並需要一些規則讓編譯器支援**插入,所以必須清楚清楚了這些規則後,才能寫出健壯的**。
objective-c物件
objectivec中的物件,有強參照(strong reference)和弱參照(weak reference)之分,當需要保持其他物件的時候,需要retain以確保物件引用計數加1。物件的持有者(owner)只要存在,那麼該物件的強參照就一直存在。
物件處理的基本規則是
引用關鍵字
arc中關於物件的引用參照,主要有下面幾關鍵字。使用strong, weak, autoreleasing限定的變數會被隱式初始化為nil。
變數宣告預設都帶有__strong關鍵字,如果變數什麼關鍵字都不寫,那麼預設就是強參照。
上面已經看到了,這是弱參照的關鍵字。該概念是新特性,從 ios 5/ mac os x 10.7 開始匯入。由於該型別不影響物件的生命週期,所以如果物件之前就沒有持有者,那麼會出現剛建立就被破棄的問題。
如果編譯設定os版本 deployment target 設定為這比這低的版本,那麼編譯時將報錯(the current deployment target does not support automated __weak references),這個時候,我們可以使用下面的 __unsafe_unretained。
弱參照還有乙個特徵,即當引數物件失去所有者之後,變數會被自動付上nil (zeroing)。
該關鍵字與__weak一樣,也是弱參照,與__weak的區別只是是否執行nil賦值(zeroing)。但是這樣,需要注意變數所指的物件已經被破棄了,位址還還存在,但記憶體中物件已經沒有了。如果還是訪問該物件,將引起「bad_access」錯誤。
該關鍵字使對像延遲釋放。比如你想傳乙個未初始化的對像引用到乙個方法當中,在此方法中例項化此對像,那麼這種情況可以使用__autoreleasing。他被經常用於函式有值引數返回時的處理。
總結
今天,我們看到了基本的arc使用規則
iOS應用開發 什麼是ARC?
arc是什麼 arc基本規則 總結 新年伊始,永珍更新。新一年開始,我們來更加深入了解一下iphone開發的內部。作為開始,我們先來了解一下arc。arc是什麼 arc是ios 5推出的新功能,全稱叫 arc automatic reference counting 簡單地說,就是 中自動加入了re...
iOS應用開發 什麼是ARC?
arc是什麼 arc是ios 5推出的新功能,全稱叫 arc automatic reference counting 簡單地說,就是 中自動加入了retain release,原先需要手動新增的用來處理記憶體管理的引用計數的 可以自動地由編譯器完成了。該機能在 ios 5 mac os x 10....
iOS 開發,混合使用 ARC 和非ARC
前提知識 arc automatic reference counting,自動引用計數 在開發 ios 3 以及之前的版本的專案時我們要自己負責使用引用計數來管理記憶體,比如要手動 retain release autorelease 等,而在其後的版本可以使用 arc,讓系統自己管理記憶體。問題...