1. 程式人生 > >ios-ARC和MRC混編問題

ios-ARC和MRC混編問題

有的時候我們可能會需要做到ARC和MRC混合開發,這個時候我們需要的做的就需要去適配這個MRC了。

首先我們可以想到的是通過Xcode自帶的有一個工具可以進行轉換,去選擇To Objectivie-C ARC 那一欄,這個可以把非ARC的程式碼轉換成ARC,但是這有一個條件,就是當前環境不能是ARC的環境,所以我們應該去切換下專案的環境。

切換專案環境在點選Targets,然後再去點選Build Settings裡面去尋找


但是這樣做會有個問題,就是這個Xcode自帶的工具可以幫我們做檔案較少的轉換,如果檔案比較多就不行了,就會有如下所示的錯誤彈出

所以我們還有另外一種辦法,我們可以在Build Phases中找到Compile Sources中在檔案的後面去設定-fno-objc-arc,這樣相當於做了一個編譯的標記,告訴編譯器表示該檔案以MRC的形式來編譯。如下所示

但是這樣的話如果我們檔案比較多的,我們需要在每一個檔案後面去敲那樣的標記,顯得很麻煩。所以我們可以採取將其編譯成.a的形式,也就是編譯成靜態庫的形式來用,這樣就不存在什麼ARC還是MRC了。

我們其實還可以直接通過CocoaPods來幫我們匯入MRC的框架的話,這樣也不會出現即便框架中有release autorelease 也不會報錯了。

根據唐巧大神說的CocoaPods的工作原理如下所示,我也簡單的記錄下

CocoaPods是將所有的依賴庫都放到另一個名為 Pods 專案中,然後讓主專案依賴 Pods 專案,這樣,原始碼管理工作都從主專案移到了 Pods 專案中。

Pods 專案最終會編譯成一個名為 libPods.a 的檔案,主專案只需要依賴這個 .a 檔案即可

對於資原始檔,CocoaPods 提供了一個名為 Pods-resources.sh 的 bash 指令碼,該指令碼在每次專案編譯的時候都會執行,將第三方庫的各種資原始檔複製到目標目錄中。CocoaPods 通過一個名為 Pods.xcconfig 的檔案來在編譯時設定所有的依賴和引數。

有的時候我們想讓一些語句在MRC環境下執行,不要在ARC環境下執行,我們可以這麼做,使用條件編譯的方式

#if !__has_feature(objc_arc)
    NSLog(@"--------");
#endif

還有就是如果我們有在MRC的環境下寫好的函式,在函式裡面進行建立的,我們一般都要加上一個autorelease,所以我們其實可以用巨集定義來節省我們的時間

下面表示如果是ARC就不做任何處理,如果不是就加上對應的autorelease release retain

#if __has_feature(objc_arc)
 #define ZX_AUTORELEASE(exp) exp
 #define ZX_RELEASE(exp) exp
 #define ZX_RETAIN(exp) exp
#else
 #define ZX_AUTORELEASE(exp) [exp autorelease]
 #define ZX_RELEASE(exp) [exp release]
 #define ZX_RETAIN(exp) [exp retain]
#endif