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?

我们可以互换使用intNSInteger 吗?有没有什么具体情况只能用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。在所有其他情况下:

如果您不关心类型的宽度,请使用 C 类型,例如intlong。 如果您确实关心类型的宽度,请使用 C99 stdint.h 类型,例如int32_tint64_t。 如果您需要保证足够大的 int 来容纳指针,请使用 intptr_tuintptr_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_tintptr_t 表示指针大小的整数。 谢谢,我太 C++-98(在这种情况下是错误的)。答案已调整。

以上是关于int 和 NSInteger 有啥区别? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

使用 int[][] 和 int[,] 有啥区别? [复制]

Convert.ToInt32 和 Int32.Parse 有啥区别? [复制]

c中的long和long int有啥区别? [复制]

“new int[5]”和“malloc(5 * sizeof(int))”在 C++ 中有啥区别? [复制]

“new int[5]”和“malloc(5 * sizeof(int))”在 C++ 中有啥区别? [复制]

Convert.ToInt16 或 32 或 64 和 Int.Parse 有啥区别? [复制]