一句话:NSInteger类型在32bit的机器上不会自动转成long类型,所以要做好类型保护,防止强转溢出。
今天遇见一个问题,一个服务端返回的数据,Number类型,客户端解析后,用[xxx integerValue],拿到int类型,发现在32位的机器上(iPhone5及以下),会溢出。
例子代码如下:
NSNumber *number = @(902299992292922232);
NSInteger integerValue = [number integerValue];
long longValue = [number longValue];
记得刚开始适配64位的时候,看到过一句话:“如果不确定是int类型还是long类型,用NSInteger 肯定没错”,就理所当然的认为,编译器会在32位的机器上自动将NSInteger类型转为long,所以才出现了这种有点傻缺的问题。回头想想,编译时怎么可能知道你的程序要运行在那种设备上。而运行时,我们看看NSInteger的定义,在NSObjCRuntime.h文件中:
我们发现,64bit下,NSInteger是long,32bit下,NSInteger是int,所以一个本身是long类型的NSNumber,获取interValue相当于强转为int,当然会溢出。
同样的问题在NSCoder的编解码上也存在,在CGFloat 和float上也存在
所以,coding的时候尽量杜绝想当然和先入为主,自己动手试一试。