当开发iOS时,我应该使用NSInteger vs. int ?我在苹果的示例代码中看到,他们在将值作为参数传递给函数或从函数返回值时使用NSInteger(或NSUInteger)。

- (NSInteger)someFunc;...
- (void)someFuncWithInt:(NSInteger)value;...

但在函数中,他们只是用int来跟踪一个值

for (int i; i < something; i++)
...

int something;
something += somethingElseThatsAnInt;
...

我读过(被告知),NSInteger是一个安全的方法来引用一个整数在64位或32位的环境,所以为什么要使用int在所有?


当前回答

在iOS上,使用int还是NSInteger并不重要。如果iOS转向64位,这将变得更加重要。

简单地说,NSIntegers在32位代码中是整型(因此是32位长型),在64位代码中是长型(64位代码中的长型是64位宽的,但在32位代码中是32位宽的)。使用NSInteger而不是long的最可能的原因是不破坏现有的32位代码(使用int)。

CGFloat也有同样的问题:在32位(至少在OS X上)上,它是float;在64位上,它是双精度的。

更新:随着iPhone 5s、iPad Air、iPad Mini和iOS 7的推出,你现在可以在iOS上构建64位代码了。

更新2:另外,使用NSIntegers有助于Swift代码的互操作性。

其他回答

为什么要使用int ?

苹果使用int是因为对于一个循环控制变量(它只用于控制循环迭代)int数据类型很好,无论是数据类型大小还是它可以为你的循环保存的值。这里不需要依赖于平台的数据类型。对于一个循环控制变量,即使是一个16位整型在大多数情况下也可以。

苹果使用NSInteger作为函数返回值或函数参数,因为在这种情况下,数据类型[size]很重要,因为你用函数所做的是与其他程序或其他代码段通信/传递数据;我应该什么时候使用NSInteger vs int?在你的问题中…

他们[苹果]使用NSInteger(或NSUInteger)当传递一个值作为 函数的参数或从函数返回值。

OS X是“LP64”。这意味着:

Int总是32位的。

Long Long总是64位的。

NSInteger和long总是指针大小。这意味着它们在32位系统上是32位,在64位系统上是64位。

NSInteger存在的原因是许多遗留api错误地使用int而不是long来保存指针大小的变量,这意味着api在64位版本中必须从int更改为long。换句话说,API将具有不同的函数签名,这取决于您是为32位体系结构还是64位体系结构编译。NSInteger打算用这些遗留api来掩盖这个问题。

在你的新代码中,如果你需要一个32位变量,使用int,如果你需要一个64位整数,使用long long,如果你需要一个指针大小的变量,使用long或NSInteger。

Int = 4字节(与架构器大小无关) NSInteger =取决于架构师的大小(例如:= 4字节NSInteger size)

在iOS上,使用int还是NSInteger并不重要。如果iOS转向64位,这将变得更加重要。

简单地说,NSIntegers在32位代码中是整型(因此是32位长型),在64位代码中是长型(64位代码中的长型是64位宽的,但在32位代码中是32位宽的)。使用NSInteger而不是long的最可能的原因是不破坏现有的32位代码(使用int)。

CGFloat也有同样的问题:在32位(至少在OS X上)上,它是float;在64位上,它是双精度的。

更新:随着iPhone 5s、iPad Air、iPad Mini和iOS 7的推出,你现在可以在iOS上构建64位代码了。

更新2:另外,使用NSIntegers有助于Swift代码的互操作性。

如果你深入研究NSInteger的实现:

#if __LP64__
typedef long NSInteger;
#else
typedef int NSInteger;
#endif

简单地说,NSInteger类型定义为你做了一个步骤:如果架构是32位的,它使用int,如果是64位的,它使用long。使用NSInteger,你不需要担心程序运行的架构。