int vs NSNumber vs NSInteger

时间:2010-06-13 11:18:31

标签: iphone objective-c ios

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

day = day + 1;

这有意义吗?差异会是什么?

4 个答案:

答案 0 :(得分:45)

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

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

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

答案 1 :(得分:9)

NSInteger只是一个整数,NSNumber是一个对象,其中int是原始数据类型。

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

  

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

您可以使用以下命令将NSInteger包装到NSNumber中:

NSNumber *NumberToStore = @(21);

并使用以下方式取回:

NSInteger retrievingInteger = [NumberToStore integerValue];

答案 2 :(得分:2)

1是一个文字,如果合适,编译器会使它成为合适的数字类型。

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

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

对于NSNumber案例​​,您需要的是:

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

答案 3 :(得分:2)

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

如果dayNSinteger,您发布的示例代码将正常运行,如果它是NSNumber则根本不起作用。