iOS11誕生之際,追溯32位iPhone,思考兼容

iOS11 誕生

蘋果在06-06凌晨正式發(fā)布了iOS 11系統(tǒng),在UI風格、系統(tǒng)性能、功能上都進行了提升,但究竟哪些設(shè)備支持升級iOS 11?你手中的iPhone或者iPad究竟是否在適配之列呢?看看蘋果官方給出的答案。

image.png

此次iOS 11的更新拋棄了iPhone 5、iPhone 5c、iPad 4三款設(shè)備,宣告了32位設(shè)備的正式淘汰,這些設(shè)備用戶是時候換機了。

處理器 32bit 與 64bit 哪些機型

1.蘋果A7處理器之后都64位,以前處理器是32位。
2.iPhone5S和ipad air之后的機型都是64位,以前的版本都是32位的老機型。

iPhone 64bit歷史

2013年9月,蘋果發(fā)布了 iPhone 5s,這也是首款搭載 64 位處理器的 iPhone,同時開始支持 64 位應用。自2015年2月之后,蘋果要求開發(fā)者必須遞交 64 位新應用和應用升級。
接下來,iOS11將徹底淘汰32位應用,全面進入64位時代

  • 數(shù)據(jù)類型的變化
image.png
image.png

指令級并行性(Instruction-Level Parallelism,ILP)

解決兼容 ??

看看NSInteger在xcode中NSObjCRuntime.h里的定義

#if __LP64__ || (TARGET_OS_EMBEDDED && !TARGET_OS_IPHONE) || TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64
typedef long NSInteger;
typedef unsigned long NSUInteger;
#else
typedef int NSInteger;
typedef unsigned int NSUInteger;
#endif

數(shù)據(jù)類型里面,NSInteger在 32ILP 時等同于int (4bytes),在64ILP 時等同于long(8bytes),而這個數(shù)據(jù)結(jié)構(gòu)使用很廣,很多不規(guī)范的時候會直接和int替換使用,在32ILP是毫無問題,但在64ILP時,這就是隱患了。CGFloat也有同樣的問題,所以代碼的檢查修改必須仔細。
CGFloat定義如下

/* Definition of `CGFLOAT_TYPE', `CGFLOAT_IS_DOUBLE', `CGFLOAT_MIN', and
   `CGFLOAT_MAX'. */

#if defined(__LP64__) && __LP64__
# define CGFLOAT_TYPE double
# define CGFLOAT_IS_DOUBLE 1
# define CGFLOAT_MIN DBL_MIN
# define CGFLOAT_MAX DBL_MAX
#else
# define CGFLOAT_TYPE float
# define CGFLOAT_IS_DOUBLE 0
# define CGFLOAT_MIN FLT_MIN
# define CGFLOAT_MAX FLT_MAX
#endif

/* Definition of the `CGFloat' type and `CGFLOAT_DEFINED'. */

typedef CGFLOAT_TYPE CGFloat;

so ~ ,一般數(shù)字串(時間戳, 用戶id), 咱們使用 long long 接收就行, 無論32ILP還是64ILP ,都是分配8bytes;
帶小數(shù)的, 就不用CGFloat了, 用C語言的float / double就行, 在 32ILP/64ILP 都一樣

另外,sunny大神的博文64-bit Tips

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容