【发布时间】:2011-08-28 17:50:53
【问题描述】:
可能的重复:
When to use NSInteger vs int?
Why is there is an NSInteger?
我们可以互换使用int 和NSInteger 吗?有没有什么具体情况只能用NSInteger,而不用int?
【问题讨论】:
标签: objective-c cocoa types int nsinteger
可能的重复:
When to use NSInteger vs int?
Why is there is an NSInteger?
我们可以互换使用int 和NSInteger 吗?有没有什么具体情况只能用NSInteger,而不用int?
【问题讨论】:
标签: objective-c cocoa types int nsinteger
我们可以互换使用 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
}
在我看来,您应该只在需要将参数传递给 Cocoa 或从 Cocoa 接收结果并且文档说数据类型为 NSInteger 的地方使用 NSInteger。在所有其他情况下:
int 或 long。stdint.h 类型,例如int32_t,int64_t。 intptr_t 或 uintptr_t
【讨论】:
ptrdiff_t,而对于内存中对象的大小,size_t 是合适的。对于磁盘上文件的偏移量,off_t。所有这些都是基本的 C 内容,真的。
我会说对指针大小的整数使用标准 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
【讨论】:
uintptr_t 或intptr_t 表示指针大小的整数。