int vs NSNumber vs NSInteger

Posted

技术标签:

【中文标题】int vs NSNumber vs NSInteger【英文标题】: 【发布时间】:2010-06-13 11:18:30 【问题描述】:

我有一行代码会根据数据类型“day”和“1”而有所不同。我相信它是以下内容,尽管稍后我会检查我的源代码。

day = day + 1;

这有意义吗?会有什么不同?

【问题讨论】:

【参考方案1】:

NSInteger 是一种描述整数的类型定义 - 但它不等同于 64 位平台上的 int。 您可以通过在 Xcode 中通过 cmd 单击 NSInteger 来检查 typedef。NSInteger 在构建 32 位应用程序时定义为 int,对于 64 位应用程序定义为 long。 大多数情况下,您可以将 int 替换为 NSInteger,但这样做时需要考虑一些事项。Apple's 64-Bit Transition Guide for Cocoa 提供了一些相关信息。

NSNumber 是一个帮助您将数字类型存储为对象的类。它具有在不同类型之间进行转换的方法以及检索数值的字符串表示形式的方法。 如果您像在示例中那样使用NSNumber* 类型的变量day,则您不会修改day 的值,而是修改它的内存地址。

如果您使用时间值,您也可以查看NSDate。

【讨论】:

【参考方案2】:

NSInteger 是一个简单的整数,NSNumber 是一个对象,而int 是一个原始数据类型。

NSInteger 只不过是长整数的同义词。

如果您需要在某处存储数字,请使用 NSNumber。如果你要进行计算、循环等,请使用 NSInteger、NSUInteger 或 int。

您可以使用以下方法将 NSInteger 包装到 NSNumber 中:

NSNumber *NumberToStore = @(21);

并使用以下方法取回:

NSInteger retrievingInteger = [NumberToStore integerValue];

【讨论】:

NSNumber 如果您需要将数字存储为作为对象。例如在 NSDictionary 或 NSArray 或 NSSet 中。【参考方案3】:

NSIntegerint 是等价的,NSNumber 是用于存储原始数字类型(int、long、float 等)的对象。

如果dayNSinteger,您发布的示例代码将可以正常工作,如果它是NSNumber,则根本无法工作。

【讨论】:

NSInteger 和 int 不等同于 64 位应用程序。 (对于 64 位应用程序,NSInteger 被定义为 long)。如果 day 是 NSNumber 的实例,则发布的示例代码也将起作用,但增量不会改变值,而是接收者的地址。这很可能不是 OP 想要的。 对于 NSObject,编译器不允许你做指针运算。【参考方案4】:

1 是一个文字,如果合适的话,编译器会将其设为合适的数字类型。

但是请注意,虽然NSIntegerint 在大多数意图和目的上是相同的,但NSNumber 是一个对象类型。对于这种情况,您的代码没有意义(并且不应在没有警告的情况下编译)。

(实际上,在某些情况下,就指针算术而言,它会产生某种意义,但这完全不是您想要的。)

对于 NSNumber 情况,您可能需要类似以下内容:

day = [NSNumber numberWithInt:[day intValue] + 1];

【讨论】:

以上是关于int vs NSNumber vs NSInteger的主要内容,如果未能解决你的问题,请参考以下文章

Long vs Integer,long vs int,啥时候使用?

NSUInteger vs NSInteger,int vs unsigned,以及类似情况

为啥 INT_FAST16_MAX 被定义为 INT32_MAX (VS 2015)?

用VS2010编译的C++大作业出现了无法识别的外部符号BUG

了解双整数转换中的 int-vs-trunc 关系

运行shellcode + vs2010