int 和 NSInteger 有啥区别? [复制]
Posted
技术标签:
【中文标题】int 和 NSInteger 有啥区别? [复制]【英文标题】:What is the difference between int and NSInteger? [duplicate]int 和 NSInteger 有什么区别? [复制] 【发布时间】:2011-08-28 17:50:53 【问题描述】:可能的重复:When to use NSInteger vs int?Why is there is an NSInteger?
我们可以互换使用int
和NSInteger
吗?有没有什么具体情况只能用NSInteger
,而不用int
?
【问题讨论】:
When to use NSInteger vs int?、How to Convert NSInteger to int 或 Why is there an NSInteger 可能重复,只有三个 among many。 【参考方案1】:我们可以互换使用 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
。
如果您确实关心类型的宽度,请使用 C99 stdint.h
类型,例如int32_t
,int64_t
。
如果您需要保证足够大的 int 来容纳指针,请使用 intptr_t
或 uintptr_t
【讨论】:
另外,如果您需要两个指针之间的差异,您应该使用ptrdiff_t
,而对于内存中对象的大小,size_t
是合适的。对于磁盘上文件的偏移量,off_t
。所有这些都是基本的 C 内容,真的。【参考方案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
【讨论】:
不,使用uintptr_t
或intptr_t
表示指针大小的整数。
谢谢,我太 C++-98(在这种情况下是错误的)。答案已调整。以上是关于int 和 NSInteger 有啥区别? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
使用 int[][] 和 int[,] 有啥区别? [复制]
Convert.ToInt32 和 Int32.Parse 有啥区别? [复制]
“new int[5]”和“malloc(5 * sizeof(int))”在 C++ 中有啥区别? [复制]