iOS上應用如何兼容32位系統和64位系統 – iPhone手機開發技術文章 iPhone軟體開發教學課程

在蘋果推出iPhone5S時,64位的應用就走到瞭眼前。當時就看見蘋果官方資料宣佈iOS7.x的SDK支持瞭64位的應用,而且內置的應用都已經是64位。

我記得自己剛剛接觸電腦時還有16位的系統,指針的尋址范圍還是16位的。當年用TurboC時,還要根據應用的大小選擇是tiny模式還是其他。後來很長一段時間使用32位的模型編程,4G是牢牢記住的一個邊界條件。而現在,64位走到瞭眼前。

就如同16位轉向32位一樣,硬件肯定是最先推出的,SDK也會跟進,然後各種第三方的應用才會逐步跟進,這個過程一般都需要持續一段時間。這次蘋果在推出之後,很長一陣子也處於32位和64位並行的過渡期,但是,隨著10月份蘋果宣佈,2015年2月1日起,上傳AppStore的應用都需要支持ARM64瞭,具體消息請猛戳這裡。

於是開始看瞭一下32位應用如何轉成64位應用

1. 基礎知識

Xcode 5.0.1開始支持編譯32-bit和64-bit的Binary

同時支持32-bit和64-bit,我們需要選擇的minimum deployment target為 iOS 5.1.1

64-bit的Binary必須運行在支持64-bit的CPU上,並且最小的OS版本要求是 7.0.3

2. 讓應用兼容64位的基本步驟

安裝Xcode5.0.1或者以後——其實現在能提交AppStore的Xcode版本最少也要5.1.1

在Xcode中打開工程,編譯,修正錯誤以及警告,尤其是針對32位和64

在Project Setting裡面,把最小應用使用的SDK改到5.1.1或者更高的版本

把Architectures參數設置成“Standard Architectures (including 64-bit).”

這樣你的應用就支持瞭64位的CPU,再次修復編譯器的錯誤和警告,請註意,有些問題編譯器是沒有警告的

在64位的真機上測試你的應用

使用Instruments查看內存使用的狀況

3. 從32位到64位的變化

3.1 數據類型的變化

這裡主要是語言內置類型所占的字節數以及字節對齊的不同。在32位的年代,使用的是IPL32的規范,到瞭64位之後,改成瞭LP64規范。

除瞭這些以外,還有浮點類型vcD4KPHA+ICAgICAgPGltZyBzcmM9″/uploadfile/Collfiles/20141114/2014111409055028.png” alt=”\”>

數據類型裡面,NSInteger在32位時等同於int,在64位時等同於long,而這個數據結構使用很廣,很多不規范的時候會直接和int替換使用,在32位是毫無問題,但在64位時,這就是隱患瞭。CGFloat也有同樣的問題,所以代碼的檢查修改必須仔細。

至於對齊,如果使用瞭偏移量來訪問struct的項,那麼需要認真仔細的檢查,其餘的還算好,當然如果你用瞭malloc,那麼也請檢查一下分配的內存大小,建議是多使用sizeof來幫助計算。

還有,針對存儲的文件,比如存儲在iCloud上的文件,你無法確定是一個32位應用還是64位的應用會去訪問,那麼請一定把數據內容的解釋寫成一模一樣。

3.2 方法調用上的變化

64位應用要求所有函數都有原型,這本身就是一個好的編碼習慣

函數的造型必須和原型完全一致,尤其要避免參數個數未定的函數指針造型(printf一類)

在64位系統在運行時調用函數和32位系統是不同的。主要的區別在於傳遞具有可變參數個數的函數的參數時,我們來看下面的代碼:

int fixedFunction(int a, int b);
int variadicFunction(int a, ...);
 
int main
{
    int value2 = fixedFunction(5,5);
    int value1 = variadicFunction(5,5);
}

第一個函數是固定傳入2個參數,第二個函數是參數個數不定的,在使用中,也傳入瞭2個參數。在32位系統下,這兩個函數的參數傳遞是非常類似的,而在64位系統下,這兩者就是截然不同瞭。

3.3 匯編的不同

因為是不同的指令集,匯編當然會不同。不過我們一般的應用不會用到匯編,所以這一項比較少遇到。

4. 第三方庫

最後,我們項目中使用的第三方庫肯定需要支持64位系統,否則還是白搭。所以大傢在升級時需要檢查自己使用的第三方的庫,看是否已經有64位的版本出現瞭。

蘋果目前的系統中(iOS7/iOS8),32位的framework和64位的framework是共存的,所以如果所有的應用都是64位的話,系統就自動不加載32位的framework,這樣可以少占用資源,另外對運行的速度是有好處的,也就是說,你會感覺手機運行的快瞭一點。

應用在兼容64位系統後,內存的占用肯定會變多一點,不過性能也有相應的提升。

發佈留言