美文网首页
iOS11诞生之际,追溯32位iPhone,思考兼容

iOS11诞生之际,追溯32位iPhone,思考兼容

作者: wustzhy | 来源:发表于2017-08-01 13:30 被阅读89次
    iOS11 诞生

    苹果在06-06凌晨正式发布了iOS 11系统,在UI风格、系统性能、功能上都进行了提升,但究竟哪些设备支持升级iOS 11?你手中的iPhone或者iPad究竟是否在适配之列呢?看看苹果官方给出的答案。

    image.png

    此次iOS 11的更新抛弃了iPhone 5、iPhone 5c、iPad 4三款设备,宣告了32位设备的正式淘汰,这些设备用户是时候换机了。

    处理器 32bit 与 64bit 哪些机型

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

    iPhone 64bit历史

    2013年9月,苹果发布了 iPhone 5s,这也是首款搭载 64 位处理器的 iPhone,同时开始支持 64 位应用。自2015年2月之后,苹果要求开发者必须递交 64 位新应用和应用升级。
    接下来,iOS11将彻底淘汰32位应用,全面进入64位时代

    • 数据类型的变化
    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
    

    数据类型里面,NSInteger在 32ILP 时等同于int (4bytes),在64ILP 时等同于long(8bytes),而这个数据结构使用很广,很多不规范的时候会直接和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 ~ ,一般数字串(时间戳, 用户id), 咱们使用 long long 接收就行, 无论32ILP还是64ILP ,都是分配8bytes;
    带小数的, 就不用CGFloat了, 用C语言的float / double就行, 在 32ILP/64ILP 都一样

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

    相关文章

      网友评论

          本文标题:iOS11诞生之际,追溯32位iPhone,思考兼容

          本文链接:https://www.haomeiwen.com/subject/lwjjlxtx.html