我有一行代码将根据数据类型“day”和“1”的不同而有所不同。我相信它是以下内容,但我稍后会检查我的源代码。
day = day + 1;
这有意义吗?差异会是什么?
答案 0 :(得分:45)
NSInteger
是一个描述整数的类型定义 - 但它不等同于64位平台上的int
。
您可以通过cmd单击Xcode中的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
是一个文字,如果合适,编译器会使它成为合适的数字类型。
但是,请注意,尽管NSInteger
和int
对于大多数意图和目的都是相同的,但NSNumber
是一种对象类型。对于这种情况,您的代码没有意义(并且不应该在没有警告的情况下进行编译)。
(实际上,在一些情况下,它会在指针算术方面产生某种意义,但这完全不是你想要的。)
对于NSNumber案例,您需要的是:
day = [NSNumber numberWithInt:[day intValue] + 1];
答案 3 :(得分:2)
NSInteger
和int
是等价的,NSNumber
是用于存储基本数字类型的对象(int,long,float等)。
如果day
是NSinteger
,您发布的示例代码将正常运行,如果它是NSNumber
则根本不起作用。