天天看點

iOS上應用如何相容32位系統和64位系統

      在蘋果推出iphone5s時,64位的應用就走到了眼前。當時就看見蘋果官方資料宣布ios7.x的sdk支援了64位的應用,而且内置的應用都已經是64位。

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

      于是開始看了一下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規範。

iOS上應用如何相容32位系統和64位系統

      除了這些以外,還有浮點類型

iOS上應用如何相容32位系統和64位系統

      資料類型裡面,nsinteger在32位時等同于int,在64位時等同于long,而這個資料結構使用很廣,很多不規範的時候會直接和int替換使用,在32位是毫無問題,但在64位時,這就是隐患了。cgfloat也有同樣的問題,是以代碼的檢查修改必須仔細。

      至于對齊,如果使用了偏移量來通路struct的項,那麼需要認真仔細的檢查,其餘的還算好,當然如果你用了malloc,那麼也請檢查一下配置設定的記憶體大小,建議是多使用sizeof來幫助計算。

      還有,針對存儲的檔案,比如存儲在icloud上的檔案,你無法确定是一個32位應用還是64位的應用會去通路,那麼請一定把資料内容的解釋寫成一模一樣。

3.2 方法調用上的變化

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

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

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

iOS上應用如何相容32位系統和64位系統

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位系統後,記憶體的占用肯定會變多一點,不過性能也有相應的提升。

繼續閱讀