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

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

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

【问题讨论】:

标签: iphone objective-c int nsinteger nsuinteger


【解决方案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 或其他任何东西编译相同的代码时不需要考虑平台差异。这是一个抽象。有人说您应该使用完成工作的最高抽象级别。所以除非你有理由不使用这些类型,否则我会说使用它们。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-28
    • 2015-10-26
    • 2011-02-03
    • 1970-01-01
    • 2014-03-17
    • 2013-12-19
    相关资源
    最近更新 更多