美文网首页
iphone5引发的bug

iphone5引发的bug

作者: 白天才痴 | 来源:发表于2016-08-02 00:23 被阅读113次

    最近项目里有一个功能被曝说在iphone5上失效,追查后的原因是一个id值在iphone5存储到NSNumber时数据溢出导致的。开始时rd告诉我说是由于iphone5上的cpu架构是32位的,而从iphone5s开始cpu架构是64位的,代码里用的int也是不同size导致。
    虽然我没写过oc的代码,但是我知道在c++里int的size是固定的4bytes,而long才是可变的。最终跟了一下代码,原来代码里用了NSInteger这个包裹类,而其定义为:

    #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 
    

    从定义可以看到,其定义是跟CPU总线位数相关的,而long得size是32位系统下为4bytes,64位系统下为8bytes。
    从官方doc可以见到。
    Table 1-1 Size and alignment of integer data types in OS X and iOS

    Integer data type ILP32 size ILP32 alignment LP64 size LP64 alignment
    char 1 byte 1 byte 1 byte 1 byte
    BOOL, bool 1 byte 1 byte 1 byte 1 byte
    short 2 bytes 2 bytes 2 bytes 2 bytes
    int 4 bytes 4 bytes 4 bytes 4 bytes
    long 4 bytes 4 bytes 8 bytes 8 bytes
    long long 8 bytes 4 bytes 8 bytes 8 bytes

    相关文章

      网友评论

          本文标题:iphone5引发的bug

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