【问题标题】:Is an NSUInteger equivalent to a plain old int? [duplicate]NSUInteger 是否等同于普通的旧 int? [复制]
【发布时间】:2014-04-06 23:54:00
【问题描述】:

我只是在学习。在本教程中,他们声明了一个接受 NSUInteger 参数的块,然后他们只需传入 64 。 . .我的印象是所有这些NS 都是对象包装器,与内置的 c 类型不同。

现在我正在写这篇文章,我记得他们之前说过我们不需要 NSUInteger 声明中的 *,因为它不像像其他 NS 对象.

但是...NSUInteger 显然不是 c 类型。那么……这是怎么回事?

【问题讨论】:

  • 转到定义,你会看到它来自哪里。
  • NSUInteger 一个普通的旧整数类型,但它可能与unsigned int不同。
  • 如您所见,并非以NS 开头的所有内容都是一个类。有些是原始类型的 typedef。

标签: objective-c


【解决方案1】:

简短回答:有时,NSUInteger 是“无符号整数”。但有时并非如此。这取决于您编译代码的平台。

长答案:

NSUInteger 或 NSInteger 在 NSObjCRuntime.h 中定义,您可以 Command+单击 NSUInteger 并查看以下定义:

#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

所以,一般来说,在64位环境下,NSUInteger是unsigned long的别名,而在32位环境下,是int。

由于新 iPhone 5s 运行在 64 位 CPU 上,因此建议使用 NSUInteger 或 NSInteger 代替普通的 unsign int 或 int。

最后,NSUInteger 确实是一个真正的 c 类型,换个名字,所以编译器可以为你做一些工作来更好地处理它。

【讨论】:

    【解决方案2】:

    NSUInteger 就像无符号整数 NSInteger 类似于 int

    When to use NSInteger vs. int

    【讨论】:

      【解决方案3】:

      如果在 XCode 中,您在 NSInteger 上option-Click,您将转到定义:

      #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
      

      所以对于 64 位系统,它被定义为 long,而不是 int

      【讨论】:

        猜你喜欢
        • 2012-04-02
        • 2011-10-26
        • 2011-09-08
        • 2018-05-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-05
        相关资源
        最近更新 更多