NSInteger 与NSUInteger

我们在使用Objcective-C 语言写程式的时候,往往使用NSInteger 与NSUInteger 代表带号与非带号的整数。严格来说,NSInteger 并不能算是「Objcective-C 的整数」,因为NSInteger 其实是C 语言的形态,而不是Objcective-C 实例,用来代表数字的Objcective-C 物实例,是像NSNumber,以及我们在前面小计算机练习中用到的NSDecimalNumber。

NSInteger 就是C 的整数。我们来看一下里头的定义:

#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

在里头定义了一些Macro,在64 位元环境下, NSInteger 被宣告成long,也就是64 位元的整数,在32 位元环境下则是int。同时,NSUInteger 在64 与32 位元环境下分别是unsigned long 与unsigned int。

我们写的代码往往需要同时在64 位元与32 位元环境上执行,像iPhone 5 与之前的机种使用armv7 CPU、是32 位元环境,iPhone 5S 之后则在arm64 上。因此,当我们在使用整数的时候,即使我们也可以直接使用int 或long,但我们会尽量使用NSInteger 与NSUInteger,让compiler 帮我们决定应该是32 或64 位整数。

另外,在使用浮点数的时候,也尽量使用CGFloat。CGFloat 一样会在不同环境下,被当成32 或64 位浮点数。

results matching ""

    No results matching ""