【发布时间】:2010-06-13 11:18:30
【问题描述】:
我有一行代码会根据数据类型“day”和“1”而有所不同。我相信它是以下内容,尽管稍后我会检查我的源代码。
day = day + 1;
这有意义吗?会有什么不同?
【问题讨论】:
标签: iphone objective-c ios
我有一行代码会根据数据类型“day”和“1”而有所不同。我相信它是以下内容,尽管稍后我会检查我的源代码。
day = day + 1;
这有意义吗?会有什么不同?
【问题讨论】:
标签: iphone objective-c ios
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。
【讨论】:
NSInteger 是一个简单的整数,NSNumber 是一个对象,而int 是一个原始数据类型。
NSInteger 只不过是长整数的同义词。
如果您需要在某处存储数字,请使用 NSNumber。如果你要进行计算、循环等,请使用 NSInteger、NSUInteger 或 int。
您可以使用以下方法将 NSInteger 包装到 NSNumber 中:
NSNumber *NumberToStore = @(21);
并使用以下方法取回:
NSInteger retrievingInteger = [NumberToStore integerValue];
【讨论】:
NSInteger 和int 是等价的,NSNumber 是用于存储原始数字类型(int、long、float 等)的对象。
如果day 是NSinteger,您发布的示例代码将可以正常工作,如果它是NSNumber,则根本无法工作。
【讨论】:
1 是一个文字,如果合适的话,编译器会将其设为合适的数字类型。
但是请注意,虽然NSInteger 和int 在大多数意图和目的上是相同的,但NSNumber 是一个对象类型。对于这种情况,您的代码没有意义(并且不应在没有警告的情况下编译)。
(实际上,在某些情况下,就指针算术而言,它会产生某种意义,但这完全不是您想要的。)
对于 NSNumber 情况,您可能需要类似以下内容:
day = [NSNumber numberWithInt:[day intValue] + 1];
【讨论】: