吐槽NSInteger

作者: 大猿媛 | 来源:发表于2017-06-23 11:13 被阅读336次

NSInteger是苹果推荐的使用,关于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

解释为:在64位系统上编码运行,NSInteger表示long类型,在32位系统上编码运行,NSInteger表示Int类型,一个最常见的现象就是,我们使用NSLog打印输出,或者NSString的format NSInteger类型数据的时候,不管你用ld%或者d%, Xcode都会爆黄色警告。

苹果的用意是什么呢?让我们省去思考是使用int还是用long的时间?很坑的地方就在于这里,当我们一时疏忽没有考虑NSInteger的32位和64位系统的时候,我们一意孤行的用了NSInteger,而且app已经上线了,突然有一天,我发现app上一个数值的显示变成了0, 我疯狂找bug,当最后发现是这个问题的时候,我发誓再也不想用NSInteger了。

补充
在32位系统中
int 占4个字节, long 占4个字节 ,NSInteger 是int的别名,占4个字节, long long 占8个字节, int32_t 是int的别名,占4个字节, int64_t 是long long的别名,占8个字节

在64位系统中
int 占4个字节, long 占8个字节, NSInteger 是long的别名,占8个字节, long long 占8个字节, int32_t 是int的别名,占4个字节, int64_t 是long long的别名,占8个字节
由于long和NSInteger的字节数变了,所以在兼容的时候可能会导致溢出
变量范围
4字节的整数变量,它的范围是 -2147483648 ~ 2147483647 ,如果不带符号,它的范围是 0 ~ 4294967295
8字节的整数变量,它的范围是 -9223372036854775808 ~ 9223372036854775807 ,如果不带符号,它的范围是 0 ~ 18446744073709551615

所以对于一个11位的整数,它在64位系统中使用NSInteger或者long类型,是可以正常存储的 ,如果是在32位系统中,它就溢出了, 要保证某些较大的整数可以正常使用,那么就需要使用long long或者int64_t这样的类型
另外在类型转换的时候, 例如 int64_t转换成NSInteger,在64位系统中是正常的 但在32位系统中就可能会导致溢出
总结:
在兼容32位和64位系统,使用int, long long(或者int32_t,int64_t)这样的数据类型比使用NSInteger可靠得多

相关文章

  • 吐槽NSInteger

    NSInteger是苹果推荐的使用,关于NSInteger的定义,苹果是这样给的: 解释为:在64位系统上编码运行...

  • 吐槽吐槽

    今日复盘 吐槽女领导 说起女领导,接连两份工作的领导都是女强人,之前的女领导我们都喊珺姐,珺姐是一步一步脚踏实地坐...

  • 吐槽吐槽

    悲伤的故事,问了室友今天聚会事宜。问的问题是你去哪里吃的,吃的啥呀!被室友回,你没权问我这么多。我睁大了瞳孔,心想...

  • 吐槽吐槽

    人世间最痛苦的事莫过于住着自己的破房子,算计着别人的大别墅!惦记着别人所拥有的!永远过不好自己这一辈子! 人,活得...

  • 吐槽 “吐槽”

    今天在简书上看文章。且不说文章质量,无处不在的错别字让我越看越恼火。不尊重文字的人竟然也在这里卖弄文字! 那就在这...

  • 吐槽吐槽

    我是个不怎么会开玩笑的人,不会吐槽,不会自黑,不会逗比。我是个向往成为段子手的人,想学吐槽,正在自黑,要做逗比。 ...

  • 吐槽吐槽

    看了两期吐槽大会,都不如以前吐周杰的那期,可见一旦受了限制,不受限的部分也会跟着火力大减。 过程中完全没有为两位主...

  • 吐槽吐槽

    来来来,一起来吐槽下你们公司的产品经理呗,看看你们公司的都是咋样的,让我心里能好受点呀。。。。。。 过去了又是崭新...

  • 吐槽吐槽

    阅读 《人性的证明》,文枝的尸体快要被找到了,随着陈年往事的迷雾被拨开,霍华德的死因开始逐渐清晰。 运动 瑜伽30...

  • 吐槽吐槽

    我自问不是一个无理取闹的人,偏偏却被人说成是无理取闹,你说我能不生气吗?况且这个人,还是一个我不想理会的人。 究竟...

网友评论

    本文标题:吐槽NSInteger

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