IOS ARC 和 非ARC 之間的轉換方法:
1,選擇項目中的Targets,選中你所要操作的Target,
2,選Build Phases,在其中Complie Sources中選擇需要ARC的文件雙擊,
并在輸入框中輸入:-fobjc-arc,如果不要ARC則輸入:-fno-objc-arc
iOS- 如何將非ARC的項目轉換成ARC項目(實戰)
1.前言
因為公司有個國外餐飲系統,編程開發了3-4年,之前用的都是非ARC,開發到今年,第一批迭代開發的人員早已不見,目前發現了有許多的內存泄露之類的,系統沒有自動釋放該釋放的內存。一旦app長時間使用,內存沒有得到釋放,最后導致app閃崩。涉及到的地方特別多,特別繁雜。故我有了打算將此項目完全轉換稱arc項目的意向。經過1個星期的轉換與1個星期的測試,成功將非arc項目轉換稱arc項目。
因為很少找到有公司將大型老app進行arc轉換,所以網上這方面的資料都特別少。
經過這次嘗試,我證明了是可行的。
現在就在博客里總結一下我遇到的一些問題。
畢竟ARC是objc未來。
Xcode 自帶一個自動轉換的功能,不過只適合比較小的項目,在大型項目上是不適合適用的,所以我這里是全手動轉換。
2.將項目編譯環境改成arc
將紅圈處從No 改成Yes
如果你現在的工程不支持ARC技術,你可以通過一個自動轉換工具來轉換你的工程(
工具在Edit>Refactor>Convertto Objective-C ARC
),這個工具會自動所有工程中手動管理內存的點轉換成合適自動方式的(比如移除retain, release等)。這個工具會轉換工程中所有的文件。當然你可以轉換單個文件。
3.下面的這些函數:dealloc,retain, release, retainCount, autorelease。禁止任何形式調用和實現(dealloc可能會被實現)
將這些內存管理的東西全部刪掉或注釋
4.不能使用
NSAutoreleasePool
.可以考慮直接注釋
作為替代,@autoreleasepool被引入,你可以使用這個效率更高的關鍵詞。
5.在做橋接轉換時報錯,用xcode提示替換
6.ARC語法的一些規則
6.1.代碼中不能使用retain, release, retain, autorelease
6.2.不重載dealloc(如果是釋放對象內存以外的處理,是可以重載該函數的,但是不能調用[super dealloc])
6.3.不能使用NSAllocateObject, NSDeallocateObject
6.4.不能在C結構體中使用對象指針
6.5.id與void *間的如果cast時需要用特定的方法(__bridge關鍵字)
6.6.不能使用NSAutoReleasePool、而需要@autoreleasepool塊
6.7.不能使用“new”開始的屬性名稱 (如果使用會有下面的編譯錯誤”Property’s synthesized getter follows Cocoa naming convention for returning ‘owned’ objects”)
7.第三方包的問題,第三方框架的問題
我們項目里可能引用了許多第三方框架。
大部分都是用一些宏來讓代碼可以同時適應arc和非arc的
(用#if __has_feature(objc_arc)判斷)
。如果代碼量不大,可以考慮自己進行改寫
你可以按上面的步驟將第三方框架自己手動改稱arc
如果是大型框架的話,可以采取標記此框架保留非arc的環境不變,繼續使用。
1,選擇項目中的Targets,選中你所要操作的Target,
2,選Build Phases,在其中Complie Sources中選擇需要ARC的文件雙擊,并在輸入框中輸入:-fobjc-arc,如果不要ARC則輸入:-fno-objc-arc