1. 程式人生 > >iOS開發32位與64位的坑

iOS開發32位與64位的坑

  眾所周知,蘋果是從iPhone 5s開始對全線移動產品使用64位架構,那麼如果App需要相容32位和64位的機型,就需要注意它們之間的區別。

  下面我們首先看看基本資料型別的區別:

32位編譯器

char :1個位元組

char*(即指標變數): 4個位元組(32位的定址空間是2^32, 即32個bit,也就是4個位元組。同理64位編譯器)

short int : 2個位元組

int:  4個位元組

unsigned int : 4個位元組

float:  4個位元組

double:   8個位元組

long:   4個位元組

long long:  8個位元組

unsigned long:  4個位元組

64位編譯器

char :1個位元組

char*(即指標變數): 8個位元組

short int : 2個位元組

int:  4個位元組

unsigned int : 4個位元組

float:  4個位元組

double:   8個位元組

long:   8個位元組

long long:  8個位元組

從上面的比較我們可以看的出來,對於32位的機器來說,long是四個位元組,而對於64位機器的long是8位元組,如果在專案開發過程中忽略了這個點,很容易出現問題。下面舉例分析:

   在我們的專案中,有這樣的需求,伺服器端返回一個時間戳,單位為毫秒,客戶端需要解析該欄位並轉化為NSDate,儲存到資料庫中。對64位的機器我們只需要定義一個欄位,比如startTime,型別為long,解析欄位可以使用objectForKey的longValue獲取到時間戳,然後轉換為時間型別,沒有任何問題。但是在32位,我們發現轉換後的時間型別是錯誤的,型別1970...。究其原因,就是因為32位機器上毫秒級的時間戳longValue後越界,導致後續轉換都異常。解決這類問題的方法是在涉及到時間戳為毫秒的情況下,定義相應欄位是long long型別,通過longLongValue獲取到值,就不存在溢位的情況。

   如果這偏文章能給你帶來啟發請關注我其他的文章,或者搜尋微訊號:785798889關注我,謝謝~