iOS上的NSInteger与64位架构

7

我正在努力弄清楚我应该对 NSInteger 和 int 有多在意。我没有计算机科学学位,所以很多类型转换参数听起来非常晦涩难懂。据我所知,论点是“在 iOS 中使用 NSInteger 而不是 int,这样如果/当 64 位 iOS 推出时,您的变量仍然具有正确的大小来存储指针”。好吧,除非我几乎从不在我的 int 中存储指针。

假设我有一个 int 存储欠 Jack 魔法豆的数量,另一个 int 存储剥猫的方法数,我在函数之间传递它们,将它们写入 Core Data 等等,然后苹果发布 64 位 iOS——会发生什么改变呢?我为什么要关心呢?

此外,如果我确实需要关心,为什么不使用 int32_t 而不是 NSInteger 呢?似乎 那个 才是保持事情可预测的方法。


剥猫皮的方式可能超过32位,甚至64位也不一定够用;-) ;-) ;-) - Sergey Kalinichenko
我从来没有理解过 NSInteger 的意义...如果它是一个 NSObject(像 NSNumber 一样),那么我就能理解了...就个人而言,我从不使用 NSInteger,因为它会损害我的跨平台兼容性... - Goz
3
@dasblinkenlight-- 它不是猫,是一只狗狗,它被“搞砸”了,而不是被剥皮。这种“搞砸”在 C 语言发展早期时就已经存在了,因为开发人员将 "int"、"short" 和 "long" 留给了解释的空间。然后是重新解释。再然后是再次解释... 每次尝试修正它似乎都会造成新的问题。据我所知,Objective-C/Cocoa 的开发人员创造了 NSInteger 类型,以便他们能够控制该类型的大小,独立于其他 int 类型的定义,从而使得他们声明的接口不受其他定义的影响(反之亦然)。 - Hot Licks
@Goz 什么是跨平台兼容性?NSInteger明确是为Obj-C设计的,除了一些边缘情况,比如GNUStep也使用NSInteger之外,没有其他语言在使用。如果你在使用C/C++,当然要使用int。 - Steve Waddicor
通常情况下,如果你正在使用一个平台,最好遵循该平台的规范,除非你有非常充分的理由不这样做。如果你真的必须知道为什么要这样做,那么原因是确保你使用的 int 长度与 API 预期的长度相同。 - Steve Waddicor
显示剩余2条评论
2个回答

5
你关于使用C99中头文件<stdint.h>的类型的观点是非常有道理的:这些类型可以让你更好地控制整数类型的大小。然而,以NS为前缀的整数类型早于<stdint.h>的标准化,因此引入了一组并行的抽象层。
当与Cocoa方法交互时,我使用以NS为前缀的整数类型。例如,如果一个Cocoa方法返回NSUinteger,我也会使用NSUinteger类型来声明我的变量。
当我需要精确控制所存储数据的大小时,我使用<stdint.h>类型的变量。在Core Data中出现的项目都属于这个范畴。
当整数类型的大小不重要时,例如在for循环中需要一个循环控制变量时,我使用int类型。

2

我的建议:

  • 编写 Obj-C 代码时,请使用 NSInteger。这样就符合您所使用的框架。它可能会从 int 更改为其他类型(int64_tlong,?)。

  • 如果编写 C/C++ 代码(可移植性),显然不要使用 NSInteger

如果您认为您的变量将超过 INT_MAX(请在此处检查常数:http://www.cplusplus.com/reference/climits/ ),您可以使用 int64_t (当您想要具有 32/64 位灵活代码时)或 long (如果您不共享内存对象在您的应用程序的 32/64 位版本之间)。还要考虑使用无符号类型(uintuint64_t),当您确定没有负值在您的变量中时。

对于指针,在内部不要使用 int。请使用 void *


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接