iOS:当NSInteger遇见32位设备

一句话: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的时候尽量杜绝想当然和先入为主,自己动手试一试。


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • *面试心声:其实这些题本人都没怎么背,但是在上海 两周半 面了大约10家 收到差不多3个offer,总结起来就是把...
    Dove_iOS阅读 27,210评论 30 471
  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 12,769评论 0 33
  • 本文结构 参考孟岩老师的文章,对本文结构如下划分 基本数据类型基本语法数组和其他集合类基本输入输出和文件处理,输入...
    不抄完整本三国不改名阅读 539评论 0 1
  • 苹果在2014年10月20号发布了一条消息:从明年的二月一号开始,提交到App Store的应用必须支持64-bi...
    Yaanco阅读 2,354评论 0 9
  • 小和尚和大流子再次相遇是在四个月后。 大流子是来接初入城市的小妹,没接到小妹,却遇到了小和尚。 大流子有些吃惊:你...
    猫云七阅读 291评论 2 1