14

可能的重复:
何时使用 NSInteger 与 int?
为什么会有一个 NSInteger?

我们可以使用intNSInteger互换吗?是否有任何特定情况只能使用NSInteger,而不是使用int

4

2 回答 2

20

我们可以互换使用 int 和 NSInteger 吗?

不。在 Apple 使用的 LP64 架构上,对于现代 OS X Cocoa,NSInteger 是 64 位宽。这意味着如果将 NSInteger 转换为 int,与NSNotFound的比较可能会失败。这是一个例子:

NSRange theRange = [@"foo" rangeOfString @"x"];
int location = theRange.location;
if (location == NSNotFound) // comparison is broken due to truncation in line above
{
    // x not in foo
}

在我看来,您应该只NSInteger在需要将参数传递给 Cocoa 或从 Cocoa 接收结果并且文档说数据类型为NSInteger. 在所有其他情况下:

  • 如果您不关心类型的宽度,请使用 C 类型,例如intlong.
  • 如果您确实关心类型的宽度,请使用 C99stdint.h类型,例如int32_t, int64_t.
  • 如果您需要保证足够大的 int 来容纳指针,请使用intptr_tuintptr_t
于 2011-05-19T10:08:32.257 回答
2

我会说将标准 C99 uintptr_t 用于指针大小的整数。NSInteger 的定义看起来很模糊,不能确定它是否保证持有一个指针。

如果必须,在 API 使用它的地方使用 NSInteger。但 long 将适用于所有实际目的。

查看 NSObjCRunTime,我并没有真正理解其当前定义的动机。可能有一个足够大的整数类型,例如,一个 NSArray 中的最大项目数?

#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
于 2011-05-19T10:17:22.630 回答