iOS ARC簡要介紹

乞力馬紮羅的雪CYF發表於2015-09-20

(1)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)工具。

我們之前使用Objective-C中記憶體管理規則時,往往採用下面的準則

  •    生成物件時,使用autorelease
  •    物件代入時,先autorelease後再retain
  •    物件在函式中返回時,使用return [[object retain] autorelease];

而使用ARC後,我們可以不需要這樣做了,甚至連最基礎的release都不需要了。

(2)使用ARC的好處?

  • 看到上面的例子,大家就知道了,以後寫Objective-C的程式碼變得簡單多了,因為我們不需要擔心煩人的記憶體管理,擔心記憶體洩露了
  •    程式碼的總量變少了,看上去清爽了不少,也節省了勞動力
  •    程式碼高速化,由於使用編譯器管理引用計數,減少了低效程式碼的可能性
(3)ARC的缺點?

  • 記住一堆新的ARC規則 — 關鍵字及特性等需要一定的學習週期
  •    一些舊的程式碼,第三方程式碼使用的時候比較麻煩;修改程式碼需要工數,要麼修改編譯開關

(4)ARC基本規則

  •   retain, release, autorelease, dealloc由編譯器自動插入,不能在程式碼中呼叫
  •     dealloc雖然可以被過載,但是不能呼叫[super dealloc]

由於ARC並不是GC,並需要一些規則讓編譯器支援程式碼插入,所以必須清楚清楚了這些規則後,才能寫出健壯的程式碼。

(5)總結

今天,我們看到了基本的ARC使用規則
  •     程式碼中不能使用retain, release, retain, autorelease
  •     不過載dealloc(如果是釋放物件記憶體以外的處理,是可以過載該函式的,但是不能呼叫[super dealloc])
  •     不能使用NSAllocateObject, NSDeallocateObject
  •     不能在C結構體中使用物件指標
  •     id與void *間的如果cast時需要用特定的方法(__bridge關鍵字)
  •     不能使用NSAutoReleasePool、而需要@autoreleasepool塊
  •     不能使用“new”開始的屬性名稱 (如果使用會有下面的編譯錯誤”Property’s synthesized getter follows Cocoa naming convention for returning ‘owned’ objects”)

原文地址:http://www.yifeiyang.net/development-of-the-iphone-simply-1/


github主頁:https://github.com/chenyufeng1991  。歡迎大家訪問!

相關文章