【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位系統是不同的。主要的區別在於傳遞具有可變引數個數的函式的引數時,我們來看下面的程式碼:
- int fixedFunction(int a, int b);
- int variadicFunction(int a, ...);
- int main
- {
- int value2 = fixedFunction(5,5);
- int value1 = variadicFunction(5,5);
- }
3、 彙編的不同
因為是不同的指令集,彙編當然會不同。不過我們一般的應用不會用到彙編,所以這一項比較少遇到。
四、第三方庫使用注意
我們專案中使用的第三方庫肯定需要支援64位系統,否則還是白搭。所以大家在升級時需要檢查自己使用的第三方的庫,看是否已經有64位的版本出現了。
五、其他
蘋果目前的系統中(iOS7/iOS8),32位的framework和64位的framework是共存的,所以如果所有的應用都是64位的話,系統就自動不載入32位的framework,這樣可以少佔用資源,另外對執行的速度是有好處的,也就是說,你會感覺手機執行的快了一點。
應用在相容64位系統後,記憶體的佔用肯定會變多一點,不過效能也有相應的提升。