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];