最近更新了xcode4.5,用上了ios6的SDK。但用着用着發現一個比較煩的問題,以前很多代碼提示錯誤,發現原來因為xcode啟用了ARC,當ARC啟用後會自動在代碼中加入retain、release,原先需要手動添加的用來處理記憶體管理的引用計數的代碼可以自動地由編譯器完成了。雖然有很大的好處,但是對于以前代碼中加的retain、release等會是以報錯,解決辦法很簡單,禁用ARC即可,方法如下:
可以在 Build Setting => "Apple LLVM compiler 3.0-Auto Reference Counting“ => "Mugrate cide from MRR to ARC" 設定為 "MIGRATE code to ARC after building with PRECHECK" 這個就可以跳過煩人的預文法檢查報錯, 且自動轉換成ARC。
禁用可以設定 Build Setting => "Apple LLVM compiler 3.0-Code Generation“ => “Objective-C automatic Reference Counting" 置為NO。
還可以設定 "Build Phases" => "Compile Sources" 中在禁用的源檔案上加編譯參數: -fno-objc-arc 。
基本的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”)
使用ARC的好處
Objective-C的代碼變得簡單多了,因為我們不需要擔心煩人的記憶體管理,擔心記憶體洩露了
代碼的總量變少了,看上去清爽了不少,也節省了勞動力
代碼高速化,由于使用編譯器管理引用計數,減少了低效代碼的可能性
不好的地方
記住一堆新的ARC規則 — 關鍵字及特性等需要一定的學習周期
一些舊的代碼,第三方代碼使用的時候比較麻煩;修改代碼需要工數,要麼修改編譯開關