int、NSNumber和NSInteger的区别

26

我有一行代码,它将根据数据类型 "day" 和 "1" 的不同而产生不同的效果。我认为以下是这个代码,尽管稍后我会检查我的源代码。

day = day + 1;

这样做有意义吗?会有什么区别呢?

4个回答

50

NSInteger是一个类型定义,用于描述整数 - 但在64位平台上它不等同于int
您可以通过在Xcode中cmd-click NSInteger来查看typedef。
NSInteger在构建32位应用程序时被定义为int,在64位应用程序中被定义为long
大多数情况下,您可以使用NSInteger替换int,但在这样做时需要考虑一些问题。
苹果关于Cocoa的64位过渡指南提供了一些相关信息。

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

如果您正在处理时间值,也可以查看NSDate


13

NSInteger 是普通整数,NSNumber 是一个对象,而 int 是一个基本数据类型。

NSInteger 只是长整型的一个同义词。

如果需要存储一个数字,请使用 NSNumber。如果正在进行计算、循环等操作,请使用 NSInteger、NSUInteger 或 int。

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

NSNumber *NumberToStore = @(21);

并使用以下方式获取它:

NSInteger retrievingInteger = [NumberToStore integerValue];

NSNumber是用于将数字“作为对象”存储的类。例如,在NSDictionary、NSArray或NSSet中使用。 - gnasher729

3

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

如果 day 是一个 NSinteger,你发布的示例代码将可以正常工作;如果它是一个 NSNumber,则完全无法工作。


2
NSInteger和int在64位应用程序中不是等价的。(对于64位应用程序,NSInteger被定义为long)。如果day是NSNumber的实例,则发布的示例代码也将起作用,但增量不会改变值,而是改变接收器的地址。这很可能不是OP想要的。 - Thomas Zoechling
对于NSObject,编译器不允许进行指针算术运算。 - gnasher729

2
1是一个字面量,如果适用的话,编译器将其转换为相应的数值类型。但是需要注意的是,虽然NSIntegerint在大多数情况下是相同的,但NSNumber是一个对象类型。因此,在这种情况下,你的代码是没有意义的(并且不应该编译通过)。实际上,有些情况下它可能会有一定的意义,比如指针算术方面,但那绝对不是你想要的结果。对于NSNumber,你应该使用类似以下的代码:
day = [NSNumber numberWithInt:[day intValue] + 1];

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