NSUInteger是否等同于普通的旧int?

时间:2014-03-05 05:04:17

标签: objective-c

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

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

但...... {{1}}显然不是c型。那么......这里发生了什么?

3 个答案:

答案 0 :(得分:2)

简答:有时,NSUInteger是“unsigned int”。但有时它不是。这取决于您编译代码的平台。

长答案:

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

#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是无符号long的别名,而在32位环境中,它是一个int。

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

最后,NSUInteger确实是一个真正的c-type,在另一个名字中,所以编译器可以做一些工作让你更好地处理它。

答案 1 :(得分:1)

NSUInteger就像无符号整数 NSInteger就像int

When to use NSInteger vs. int

答案 2 :(得分:1)

如果在XCode中,您在NSInteger上选项 - 单击,您将转到定义:

#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