本文設計的知識點已經是老生常談了,寫本文的目的僅僅是作個記錄加深印象(我不會告訴你其實是為了準備某iOS考試可能涉及的問題而複習,哈哈)。 2015年2月1日起,所有新ios應用開發必須支持64位架構,以 ...
本文設計的知識點已經是老生常談了,寫本文的目的僅僅是作個記錄加深印象(我不會告訴你其實是為了準備某iOS考試可能涉及的問題而複習,哈哈)。
2015年2月1日起,所有新ios應用開發必須支持64位架構,以充分利用CPU資源。蘋果自身”從硬到軟”的一系列產品均已全面支持64bit:iphone5S,iOS SDK8.0,xcode5.0.1等
32bit和64bit實際上是區分處理器的架構的,隨著科技的發展和對CPU高計算能力的需求,通過增加CPU地運算位寬擴展增加cpu和記憶體之間地位寬,從而讓系統支持更大容量地記憶體(32bit處理器最多只能支持記憶體容量只有4GB,而64bit地最高則達64GB)。更多可以參考:基於x86和JVM淺談32bit與64bit的區別。
這裡不去深入理解其硬體上的差別了,我們主要關註為支持64位在開發過程中需要主要哪些問題。
一、防範基礎類型的隱式轉換
系統內置的數據類型占位元組長度的對應參照如下:
可以發現它們的長度變化可能並非我們對64-bit長度加倍的預期,所以說,程式中出現sizeof的代碼多看兩眼。應該使用下麵的類型代替基本類型:
- int -> NSInteger
- unsigned -> NSUInteger
- float -> CGFloat
- 動畫時間 -> NSTimeInterval
- …
數據類型隱式轉化導致的錯誤,如下:
NSArray *arr = @[@1,@2,@3];
for(int i=-1;i<arr.count;i++){
……
}
發現並沒有進入迴圈體,因為arr.count是NSUInteger類型,-1轉化成NSUInteger類型時變成一個巨大的數。本類和64bit沒有什麼本質的聯繫,只是通過此類說明隱式轉化可能導致的錯誤。
二、isa指針
編譯器已經預設禁用了這種使用,isa指針在32位下是Class的地址,但在64位下利用bits mask才能取出來真正的地址,若真需要,使用runtime的 object_getClass 和 object_setClass 方法。
最後列一下官方文檔中的註意點:
- 不要將指針強轉成整數
- 程式各處使用統一的數據類型
- 對不同類型的整數做運算時一定要註意
- 需要定長變數時,使用如int32_t, int64_t這種定長類型
- 使用malloc時,不要寫死size
- 使用能同時適配兩個架構的格式化字元串
- 註意函數和函數指針(類型轉換和可變參數)
- 不要直接訪問Objective-C的指針(isa)
- 使用內建的同步原語(Primitives)
- 不要硬編碼虛存頁大小