NSInteger与iOS上的64位架构

时间:2013-05-28 19:29:21

标签: ios

所以,我试图弄清楚我应该关心NSInteger与int的关系。我没有CS学位,所以很多这些类型转换论证都很难说。我可以说,最好的论点是"在iOS中使用NSInteger而不是int,这样最终如果/当64位iOS出现时,你的变量仍然是存储指针的正确大小。"很公平。除了我在我的整体中存储指针大概永远不会。

假设我有一个int存储了一个魔方bean的数量,而另一个int存储了皮肤猫的方法,我在函数之间传递它们并将它们写入Core Data等等,然后Apple发布64位iOS - 有什么变化?我为什么关心?

另外,如果我关心,为什么不使用int32_t而不是NSInteger?似乎 将是保持可预测性的方式。

2 个答案:

答案 0 :(得分:5)

关于使用C99的<stdint.h>标题中的类型的观点绝对有效:这些类型使您可以更好地控制整数类型的大小。然而,NS - 前缀整数类型早于<stdint.h>的标准化,因此引入了一组并行的抽象。

我在与Cocoa方法交互时使用NS - 前缀整数类型。例如,如果Cocoa方法返回NSUinteger,我也会使用NSUinteger类型声明我的变量。

当我需要精确控制存储数据的大小时,我在程序中使用<stdint.h>类型的变量。最终在核心数据中的项目属于此类别。

当整数类型的大小无关紧要时,例如,当我需要for循环中的循环控制变量时,我使用int

答案 1 :(得分:2)

我的建议:

  • 编写Obj-C代码时,请使用NSInteger。然后它符合您使用的框架。它可能会从int更改为其他内容(int64_tlong,?)。

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

如果您认为您的变量将超过INT_MAX(常量检查here),您可以使用int64_t(当您希望拥有32/64位灵活代码时)或{{ 1}}(如果你不在应用程序的32/64位版本之间共享内存对象)。如果您确定在您的变量中没有负值,请考虑使用无符号类型(long uint)。

内部:对于指针,请勿使用uint64_t。使用int