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可靠得多