【问题标题】:Benefits of using NSInteger over int?使用 NSInteger 而不是 int 的好处?
【发布时间】:2023-03-30 17:10:01
【问题描述】:

我试图了解在为 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。 (为什么要返回一个有符号的值?我认为它应该是无符号的,因为你不能有负数的行。)

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

【问题讨论】:

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


【解决方案1】:

我个人认为,64位其实是NSInteger和NSUInteger存在的理由;在 10.5 之前,那些不存在。两者在 64 位中简单定义为 long,在 32 位中定义为 int。

NSInteger/NSUInteger 被定义为 *dynamic 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

因此,当您想要“bit-native”大小时,可以使用它们代替更基本的 C 类型。

我建议您仔细阅读此链接。 CocoaDev has some more info.

对于您应该为每种类型使用的正确格式说明符,请参阅String Programming Guide's section on Platform Dependencies

【讨论】:

    【解决方案2】:

    我记得参加 iOS 开发者大会的时候。你必须看看iOS7中的数据类型。例如,您在 64 位设备中使用 NSInteger 并将其保存在 iCloud 上。那么你想同步到较低的设备(比如 iPad 2nd gen),你的应用程序的行为将不一样,因为它以 4 个字节而不是 8 个字节识别 NSInteger,那么你的计算就会出错。

    但到目前为止,我使用NSInteger,因为大多数情况下我的应用程序不使用 iCloud 或不同步。并避免编译器警告。

    【讨论】:

    • 我认为,这是评论而不是答案。
    【解决方案3】:

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

    Apple 将 NSInteger 用于函数返回值或函数参数,因为在这种情况下,数据类型 [大小] 很重要,因为您对函数所做的事情是与其他程序或其他代码片段进行通信/传递数据。

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

    我唯一会使用 NSInteger 的就是将值传入和传出指定它的 API。除此之外,它与 int 或 long 相比没有优势。至少使用 int 或 long 您知道在 printf 或类似语句中使用什么格式说明符。

    【讨论】:

      【解决方案4】:

      继续 Irfan 的回答: 大小(NSInteger) 等于处理器字的大小。处理器对文字的操作更加简单快捷

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-27
        • 2011-05-25
        相关资源
        最近更新 更多