iOS开发中遇到的有关数据类型的问题

作者: 黄花菜先生 | 来源:发表于2016-07-11 13:30 被阅读241次

    历时8个月,Do.Fun终于上线了。可是上线后第二天,一个测试的同事,用自己的iPhone5手机,测出飞机时间不对的问题。而使用5s、6、6s时间正常。

    先来谈谈这个bug发生的场景,Do.Fun是为一款为小型口袋无人机DOBBY服务的应用。飞机开机释放WiFi,手机连接飞机热点。因为飞机没有时间,所以打开APP,APP会获取手机系统时间,然后发送设置时间指令,为飞机设置时间。

    因为给飞机设置时间的指令数据包中,时间占8个字节。因此我就选用了long来接受从手机获取的当前系统时间。代码如下:

    NSDate *datenow = [NSDate date];//现在时间
    //转换时区
    NSTimeZone *zone = [NSTimeZone systemTimeZone];
    NSInteger interval = [zone secondsFromGMTForDate:datenow];
    NSDate *localeDate = [datenow  dateByAddingTimeInterval: interval];
    
    NSTimeInterval time=[localeDate timeIntervalSince1970]*1000;
    long i=time;      //NSTimeInterval返回的是double类型
    

    因为没有4和4s的测试机,所以设置时间这个功能一直没出问题。直到iPhone5的出现。。。

    用iPhone5连接飞机设置时间后,飞机时间并不是当前时间,而是1989年。Fuck,这是什么bug。刚开始怀疑是飞机的问题(我的代码怎么会出问题,肯定是飞机那边又出什么幺蛾子了),可是在查看代码的时候,突然想到iPhone5是32的架构,那么long在32位系统下占多少个字节?一查,懵逼了,32位下long占4个字节。好吧,肯定是数据溢出了。当将long 改为 long long一试,OK了。

    NSTimeInterval time=[localeDate timeIntervalSince1970]*1000;
    long long i=time;      //NSTimeInterval返回的是double类型
    
    iPhone 5没有64位的,只有32位架构,苹果是从iPhone 5s开始对全线移动产品使用64位架构。iPhone 5s发布之后的所有产品都是64位的。
    不同系统架构下,各数据类型所占字节

    相关文章

      网友评论

        本文标题:iOS开发中遇到的有关数据类型的问题

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