iOS中整型的介绍

2014-03-28 Xiaosong Gao 更多博文 » 博客 » GitHub »

iOS

原文链接 https://gaoxiaosong.github.io/2014/03/28/ios-integer.html
注:以下为加速网络访问所做的原文缓存,经过重新格式化,可能存在格式方面的问题,或偶有遗漏信息,请以原文为准。


本文介绍了iOS中NSInteger/NSUInteger与int/unsigned int、long/unsigned long之间的区别。

在iOS开发中经常使用NSInteger和NSUInteger,而在其他的类似于C++的语言中,我们经常使用的是int、unsigned int。我们知道iOS也可以使用g++编译器,那么它们之间是否有什么联系呢?

从NSUInteger和NSInteger的定义文件NSObjCRuntime.h中发现有这样的语句:

#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

这里可以清楚的看出NSInteger和int,NSUInteger和unsigned int之间的区别。Mac OS X系统即为LP64,而后面则是指具体的目标硬件设备。所以NSInteger/NSUIteger与对应的int/unsigned int不是完全相等的,与对应的long/unsigned long也不是完全相等的。而是要看具体的运行环境及其硬件设备架构。

当你不知道程序运行哪种处理器架构时,你最好使用NSInteger,因为有可能int在32位系统中只是int类型,而在64位系统,int可能变是long型。

除非不得不使用int/long型,坚持使用NSInteger。

从上面的定义可以看出NSInteger/NSUInteger是一种动态定义的类型,在不同的设备,不同的架构,有可能是int类型,有可能是long类型。

为了正确的使用这些类型,可以参考String Programming Guide's section on Platform Dependencies。

为了更简单的知道NSInteger和long的大小,我们只需要记住它们的大小总是等于指针的大小,即在32bit系统中是32bit,在64bit系统大小总是64bit。