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

历时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开发中遇到的有关数据类型的问题_第1张图片
不同系统架构下,各数据类型所占字节

你可能感兴趣的:(iOS开发中遇到的有关数据类型的问题)