我们可以使用int
和NSInteger
互换吗?是否有任何特定情况只能使用NSInteger
,而不是使用int
?
问问题
15481 次
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 类型,例如
int
或long
. - 如果您确实关心类型的宽度,请使用 C99
stdint.h
类型,例如int32_t
,int64_t
. - 如果您需要保证足够大的 int 来容纳指针,请使用
intptr_t
或uintptr_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 回答