arc是什麼
arc基本規則 總結
新年伊始,永珍更新。新一年開始,我們來更加深入了解一下iphone開發的內部。作為開始,我們先來了解一下arc。
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我們之前使用objective-c中記憶體管理規則時,往往採用下面的準則-(id)initwithname:(nsstring *)name;
@end
@implementation arcobject
-(id)initwithname:(nsstring *)newname
return
self;
} @end
而使用arc後,我們可以不需要這樣做了,甚至連最基礎的release都不需要了。
使用arc的好處
使用arc有什麼好處呢?
不好的地方
關於第二點,由於 xcode4.2 中預設arc就是 on 的狀態,所以編譯舊**的時候往往有"automatic reference counting issue"的錯誤資訊。
這個時候,可以將專案編譯設定中的「objectice-c auto reference counteting」設為no。如下所示。
如果只想對某個.m檔案不適應arc,可以只針對該類檔案加上 -fno-objc-arc 編譯flags,如下圖。
arc基本規則
由於arc並不是gc,並需要一些規則讓編譯器支援**插入,所以必須清楚清楚了這些規則後,才能寫出健壯的**。
objective-c物件
objectivec中的物件,有強參照(strong reference)和弱參照(weak reference)之分,當需要保持其他物件的時候,需要retain以確保物件引用計數加1。物件的持有者(owner)只要存在,那麼該物件的強參照就一直存在。
物件處理的基本規則是
強參照 (strong reference)
firstname作為」natsu」字串物件的最初持有者,是該nsstring型別物件的strong reference。
(s2)
這裡將firstname代入到aname中,即aname也成為了@」natsu」字串物件的持有者,對於該物件,aname也是strong reference。
(s3)
這裡,改變firstname的內容。生成新的字串物件」maki」。這時候firstname成為」maki」的持有者,而@」natsu」的持有者只有aname。每個字串物件都有各自的持有者,所以它們都在記憶體中都存在。
(s4)
追加新的變數othername, 它將成為@」maki」物件的另乙個持有者。即nsstring型別物件的strong reference。
(s5)
將othername代入到aname,這時,aname將成為@」maki」字串物件的持有者。而物件@」natsu」已經沒有持有者了,該物件將被破棄。
弱參照 (weak reference)
接下來我們來看看弱參照 (weak reference) 的使用方式。
與強參照方式同樣,firstname作為字串物件@」natsu」的持有者存在。即是該nsstring型別物件的strong reference。
(w2)
使用關鍵字__weak,宣告弱參照weakname變數,將firstname代入。這時weakname雖然參照@」natsu」,但仍是weak reference。即weakname雖然能看到@」natsu」,但不是其持有者。
(w3)
firstname指向了新的物件@」maki」,成為其持有者,而物件@」natsu」因為沒有了持有者,即被破棄。同時weakname變數將被自動代入nil。
引用關鍵字
arc中關於物件的引用參照,主要有下面幾關鍵字。使用strong, weak, autoreleasing限定的變數會被隱式初始化為nil。
變數宣告預設都帶有__strong關鍵字,如果變數什麼關鍵字都不寫,那麼預設就是強參照。
上面已經看到了,這是弱參照的關鍵字。該概念是新特性,從 ios 5/ mac os x 10.7 開始匯入。由於該型別不影響物件的生命週期,所以如果物件之前就沒有持有者,那麼會出現剛建立就被破棄的問題,比如下面的**。
nsstring __weak *string = [[nsstring alloc] initwithformat:@如果編譯設定os版本 deployment target 設定為這比這低的版本,那麼編譯時將報錯(the current deployment target does not support automated __weak references),這個時候,我們可以使用下面的__unsafe_unretained。"first name: %@"
, [self firstname]];
nslog(@
"string: %@"
, string);
//此時 string為空
弱參照還有乙個特徵,即當引數物件失去所有者之後,變數會被自動付上nil (zeroing)。
該關鍵字與__weak一樣,也是弱參照,與__weak的區別只是是否執行nil賦值(zeroing)。但是這樣,需要注意變數所指的物件已經被破棄了,位址還還存在,但記憶體中物件已經沒有了。如果還是訪問該物件,將引起「bad_access」錯誤。
該關鍵字使對像延遲釋放。比如你想傳乙個未初始化的對像引用到乙個方法當中,在此方法中例項化此對像,那麼這種情況可以使用__autoreleasing。他被經常用於函式有值引數返回時的處理,比如下面的例子。
- (又如函式的返回值是在函式中申請的,那麼希望釋放是在呼叫端時,往往有下面的**。void
) generateerrorinvariable:(__autoreleasing nserror **)paramerror
....
-(nsstring *)stringtest即當方法的引數是id*,且希望方法返回時物件被autoreleased,那麼使用該關鍵字。// 使用arc
-(nsstring *)stringtest
總結今天,我們看到了基本的arc使用規則
iOS應用開發 什麼是ARC?
arc是什麼 arc是ios 5推出的新功能,全稱叫 arc automatic reference counting 簡單地說,就是 中自動加入了retain release,原先需要手動新增的用來處理記憶體管理的引用計數的 可以自動地由編譯器完成了。該機能在 ios 5 mac os x 10....
iOS應用開發 ARC
arc是什麼 arc是ios 5推出的新功能,全稱叫 arc automatic reference counting 簡單地說,就是 中自動加入了retain release,原先需要手動新增的用來處理記憶體管理的引用計數的 可以自動地由編譯器完成了。該機能在 ios 5 mac os x 10....
iOS開發 小白高階 什麼是ARC 二
property nonatomic,strong nsstring array 在ios程式中我們常常會看到上述的字樣那麼這究竟是什麼意思呢?這也就是我們所說的屬性。屬性 readewrite 指明屬性是read write 預設屬性是readwrite。在沒有arc以前需要 sythesize指...