int、NSInteger 和 NSUInteger 的区别

Posted

技术标签:

【中文标题】int、NSInteger 和 NSUInteger 的区别【英文标题】:Difference between int, NSInteger and NSUInteger 【发布时间】:2011-11-29 09:31:49 【问题描述】:

Objective-C 中intNSIntegerNSUInteger 的主要区别是什么?

哪个更适合在应用程序中使用,为什么?

【问题讨论】:

没有NSInt这样的东西。 See the documentation 【参考方案1】:

在这种情况下,您可以右键单击并转到定义:

#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

【讨论】:

【参考方案2】:

区别在于抽象类型及其关联的硬件大小。以某种方式,现在我们不必担心 int 的大小或它的指针在任何特定硬件上的大小。

“C”在这方面不好,只说明 long 至少和 int 一样大,int 是硬件的“自然”整数大小(不管是什么意思),int 至少是只要短——一个(大乱)。

这在当时来自 Fortran 似乎是个好主意,但并不成熟。

可以使用 POSIX 定义,例如 uint32_t、int16_t 等。但这也不能解决指针在任何特定硬件上需要多大的问题。

因此,如果 Apple 将返回类型定义为 NSUInteger,您只需使用它,您就不需要知道您的特定硬件的大小是 16 位、32 位还是 64 位。 (我从空中选择了这些值只是为了举例)。

正如您在@Bastian 中看到的,实际大小取决于硬件。

文档回答了“问题的信”,但没有提供对“为什么”的理解?

【讨论】:

你说得对。我们只知道它们之间的区别,但为什么?我仍然没有得到请建议我 这是 API 标准化。这些框架适用于多种架构——API 在它们之间都相同是很好的。通过拥有这些 typedef,Apple 正在从 API 消费者中抽象出平台差异。如果您只根据这些类型与 API 交谈,那么(理论上)您在为 i386、x86_64、ppc、arm7 或其他任何东西编译相同的代码时不需要考虑平台差异。这是一个抽象。有人说您应该使用完成工作的最高抽象级别。所以除非你有理由不使用这些类型,否则我会说使用它们。

以上是关于int、NSInteger 和 NSUInteger 的区别的主要内容,如果未能解决你的问题,请参考以下文章

NSInteger 和 int 区别

C中的int和OC中的NSInteger区别

不兼容的整数到指针的转换将“NSInteger”(又名“int”)发送到“NSInteger *”(又名“int *”)类型的参数

Cocoa - 为啥使用 NSInteger 和 CGFloat 而不是使用 int 和 float,或者总是使用 NSNumber?

int vs NSNumber vs NSInteger

不兼容的指针类型将“NSString *”发送到“NSInteger *”类型的参数(又名“int *”)