使用NSInteger而不是int的好处是什么?

12 浏览
0 Comments

使用NSInteger而不是int的好处是什么?

我正在努力理解在开发32位和64位架构时如何影响开发。根据我目前的研究,我了解到无论设备的架构如何,一个int始终占据4个字节。但是NSInteger在32位设备上占据4个字节,在64位设备上占据8个字节。我得到的印象是NSInteger更“安全”并且被推荐使用,但我不确定背后的原因是什么。\n我的问题是,如果你知道你使用的可能值永远不会很大(例如你将其用于索引一个包含200个项目的数组或存储数组中对象的计数),为什么要将其定义为NSInteger?这只会占据8个字节,而你并不会全部使用。在这种情况下,将其定义为int是否更好?如果是的话,什么情况下你会想要使用NSInteger(而不是intlong等)?显然,如果你需要使用更大的数字,你可以使用64位架构。但是如果你需要它也在32位设备上工作,你不会使用long long,因为它在32位设备上也是8个字节。我不明白为什么会使用NSInteger,至少在创建在两种架构上运行的应用程序时。\n此外,我无法想到一种接受或返回原始类型-int的方法,而使用NSInteger,我想知道其中是否还有更多。例如,(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section。我想了解为什么会这样。假设一个表格可能有2,147,483,647行,当你添加一行时,在32位设备上会发生什么-会变成-2,147,483,647吗?而在64位设备上将变为2,147,483,648。(为什么返回有符号值?我认为应该是无符号的,因为行数不能为负数。)\n最后,我想更好地了解这些数字数据类型的实际用途,也许一些代码示例会很好!

0
0 Comments

使用NSInteger而不是int的好处是,在函数的返回值或参数中,datatype [size]非常重要。因为在这种情况下,你需要与其他程序或代码片段进行数据通信/传递。

原因是Apple在循环控制变量中使用int,因为int数据类型对于控制循环迭代是可以的,无论是在数据类型大小还是在循环的值上。在这里不需要依赖于平台特定的数据类型。对于循环控制变量,即使是16位的int在大多数情况下也可以胜任。

我只会在将值传递给指定了NSInteger的API时使用NSInteger。除此之外,它与int或long相比没有任何优势。至少使用int或long,你知道在printf或类似语句中使用哪些格式说明符。

解决方法是根据具体的使用场景选择合适的数据类型,对于循环控制变量可以使用int,而对于函数返回值或参数,可以考虑使用NSInteger。这样可以确保在不同的情况下,使用合适的数据类型来传递和处理数据,避免出现数据类型不匹配的问题。

0
0 Comments

使用 NSInteger 而不是 int 的好处是可以避免在不同设备上出现数据类型不匹配的问题。在 iOS7 中,如果在一个 64 位设备上使用 NSInteger 并将其保存到 iCloud 中,然后想要同步到低版本的设备(比如 iPad 2nd gen),由于这些设备将 NSInteger 视为 4 个字节而不是 8 个字节,所以可能会导致计算结果错误。

然而,目前为止,我还是使用 NSInteger,因为我的应用程序大多数情况下并不使用 iCloud 或者不需要进行同步。而且这样做可以避免编译器的警告。

我认为这只是一个评论而不是一个答案。

0
0 Comments

使用NSInteger和NSUInteger的好处是它们可以根据不同的位数进行动态定义,适用于64位和32位系统。在64位系统中,它们被定义为long和unsigned long类型,而在32位系统中则被定义为int和unsigned int类型。因此,在需要使用原生位数大小的情况下,可以使用它们来替代更基本的C类型。

问题的出现是因为在64位系统中,使用int类型可能会导致数据溢出或类型不匹配的问题。为了解决这个问题,可以使用NSInteger和NSUInteger来确保数据的正确性和一致性。

要正确使用这些类型,可以参考苹果的官方文档中关于格式说明符的部分。在这个链接中,可以找到每种类型应使用的正确格式说明符。

总结起来,使用NSInteger和NSUInteger的好处在于它们可以根据系统的位数进行动态定义,确保数据的正确性和一致性。要正确使用它们,可以参考苹果的文档中关于格式说明符的部分。

0