NSInteger 和 NSUInteger

NSInteger 只是一个 int 或 long 的 typedef,具体取决于体系结构。NSUInteger 也是如此,它是无符号变体的 typedef。如果你检查 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

signed 和 unsigned int 或 long 之间的区别在于 signed int 或 long 可以包含负值。int 的范围是 -2 147 483 648 到 2 147 483 647,而 unsigned int 的范围是 0 到 4 294 967 295.该值加倍,因为不再使用第一位来表示该值为负或不。对于 64 位架构上的长和 NSInteger,范围要宽得多。

Apple 提供的大多数方法都是在正常 int 上返回 NS(U)Integer。如果你尝试将其强制转换为普通的 int,则会收到警告,因为如果在 64 位体系结构上运行,则会丢失精度。并非在大多数情况下都很重要,但使用 NS(U)Integer 更容易。例如,数组上的 count 方法将返回 NSUInteger。

NSNumber *iAmNumber = @0;

NSInteger iAmSigned = [iAmNumber integerValue];
NSUInteger iAmUnsigned = [iAmNumber unsignedIntegerValue];

NSLog(@"%ld", iAmSigned); // The way to print a NSInteger.
NSLog(@"%lu", iAmUnsigned); // The way to print a NSUInteger.

就像 BOOL 一样,NS(U)Integer 是一种原始数据类型,所以你有时需要将它包装在一个 NSNumber 中,你可以在整数之前使用 @来像上面那样投射它并使用下面的方法检索它。但要将其强制转换为 NSNumber,你还可以使用以下方法:

[NSNumber numberWithInteger:0];
[NSNumber numberWithUnsignedInteger:0];