可能重复:
When to use NSInteger vs int?
Why is there is an NSInteger?
我们可以互换使用int
和NSInteger
吗?是否有任何特定情况仅使用NSInteger
,而不是使用int
?
答案 0 :(得分: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
。在所有其他情况下:
int
或long
。stdint.h
类型,例如int32_t
,int64_t
。 intptr_t
或uintptr_t
答案 1 :(得分:2)
我想说使用标准C99 uintptr_t作为指针大小的整数。 NSInteger的定义看起来足够多云,不确定它是否能保证指针。
如果必须,请使用API使用的NSInteger。但是长期以来都可以用于所有实际目的。
看看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