int和NSInteger有什么区别?

时间:2011-05-19 09:46:38

标签: objective-c cocoa types int nsinteger

  

可能重复:
  When to use NSInteger vs int?
  Why is there is an NSInteger?

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

2 个答案:

答案 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。在所有其他情况下:

  • 如果您不关心类型的宽度,请使用C类型,例如intlong
  • 如果您关心类型的宽度,请使用C99 stdint.h类型,例如int32_tint64_t
  • 如果您需要一个足以保持指针的int,请使用intptr_tuintptr_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