使用NSInteger而不是int的好处?

时间:2014-05-26 02:16:00

标签: ios objective-c 64-bit 32bit-64bit nsinteger

我试图理解在开发32位和64位架构时如何影响开发。根据我迄今为止所研究的内容,我理解int始终为4个字节,无论运行应用程序的设备的架构如何。但是NSInteger在32位设备上是4个字节,在64位设备上是8个字节。我得到的印象是NSInteger更安全"并建议,但我不确定是什么原因。

我的问题是,如果您知道您使用的可能值永远不会很大(也许您正在使用它来索引到200个项目的数组或将对象的数量存储在数组),为什么要将其定义为NSInteger?当你不能全部使用它时,这将占用8个字节。在这些情况下,将它定义为int更好吗?如果是这样,您希望在什么情况下使用NSInteger(而不是intlong等)?显然,如果你需要使用更大的数字,你可以使用64位架构。但是如果你需要它也可以在32位设备上工作,你会不会使用long long,因为它在32位设备上也是8个字节?我不明白为什么会使用NSInteger,至少在创建在两种架构上运行的应用时都是如此。

此外,我无法想到一个接收或返回基本类型的方法 - int,而是使用NSInteger,并且想知道它是否还有更多,而不仅仅是值的大小。例如,(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section。我想了解为什么会这样。假设它有可能有一个2,147,483,647行的表,当你再添加一个32位设备时会发生什么 - 它会回绕到-2,147,483,647吗?在64位设备上,它将是2,147,483,648。 (为什么要返回一个有符号的值?我认为它应该是无符号的,因为你的行数不能为负。)

最终,我希望更好地了解这些数字数据类型的实际使用情况,也许一些代码示例会很棒!

4 个答案:

答案 0 :(得分:3)

我个人认为,64位实际上是NSInteger和NSUInteger存在的原因;在10.5之前,那些不存在。这两个被简单地定义为64位的长整数,以及32位的整数。

NSInteger / NSUInteger被定义为*动态typedef * s到其中一种类型,它们的定义如下:

#if __LP64__ || NS_BUILD_32_LIKE_64
typedef long NSInteger;
typedef unsigned long NSUInteger;
#else
typedef int NSInteger;
typedef unsigned int NSUInteger;
#endif

因此,当您想要“比特原生”大小时,使用它们代替更基本的C类型。

我建议你仔细阅读这个链接。 CocoaDev has some more info.

对于适用于每种类型的格式说明符,请参阅String Programming Guide's section on Platform Dependencies

答案 1 :(得分:2)

我记得参加iOS开发者大会时。你必须看看iOS7中的数据类型。例如,您在64位设备中使用NSInteger并将其保存在iCloud上。然后你想同步到较低的设备(比如iPad第二代),你的应用程序将不会表现相同,因为它识别4个字节中的NSInteger而不是8个字节,那么你的计算将是错误的。

但到目前为止,我使用的是NSInteger,因为我的应用主要不使用iCloud或不同步。并避免编译警告。

答案 2 :(得分:1)

Apple使用int,因为对于循环控制变量(仅用于控制循环迭代),int数据类型很好,无论是数据类型大小还是它可以为循环保存的值。这里不需要平台相关的数据类型。对于循环控制变量,即使是16位的int也会在大部分时间内完成。

Apple使用NSInteger作为函数返回值或函数参数,因为在这种情况下,数据类型[size]很重要,因为您正在使用函数正在与其他程序或其他代码进行通信/传递数据。 / p>

  

Apple在传递值时使用NSInteger(或NSUInteger)   函数的参数或从函数返回值。

我唯一能使用NSInteger的是将值传递给指定它的API。除此之外,它没有优于int或long。至少使用int或long你知道在printf或类似语句中使用什么格式说明符。

答案 3 :(得分:1)

继续Irfan的回答:     的sizeof(NSInteger的) 等于处理器字的大小。处理器使用单词操作更简单,更快捷