1. 程式人生 > >【iOS開發】關於如何適配32位和64位系統

【iOS開發】關於如何適配32位和64位系統

一、背景介紹

1、XCode5.0.1才開始支援編譯32-bit和64-bit的Binary

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

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

二、應用如何相容64位

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

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

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

4、把Architectures引數設定成“Standard Architectures (including 64-bit).”

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

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

7、使用Instruments檢視記憶體使用的狀況

三、32位到64位的變化

1、 資料型別的變化

      這裡主要是語言內建型別所佔的位元組數以及位元組對齊的不同。在32位的年代,使用的是IPL32的規範,到了64位之後,改成了LP64規範。

      

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

      

      

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

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

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

2、 方法呼叫上的變化

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

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

      在64位系統在執行時呼叫函式和32位系統是不同的。主要的區別在於傳遞具有可變引數個數的函式的引數時,我們來看下面的程式碼:

  1. int fixedFunction(int a, int b);  
  2. int variadicFunction(int a, ...);  
  3. int main  
  4. {  
  5.     int value2 = fixedFunction(5,5);  
  6.     int value1 = variadicFunction(5,5);  
  7. }  
      第一個函式是固定傳入2個引數,第二個函式是引數個數不定的,在使用中,也傳入了2個引數。在32位系統下,這兩個函式的引數傳遞是非常類似的,而在64位系統下,這兩者就是截然不同了。

3、 彙編的不同

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

四、第三方庫使用注意

      我們專案中使用的第三方庫肯定需要支援64位系統,否則還是白搭。所以大家在升級時需要檢查自己使用的第三方的庫,看是否已經有64位的版本出現了。

五、其他

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

      應用在相容64位系統後,記憶體的佔用肯定會變多一點,不過效能也有相應的提升。