【发布时间】:2016-05-16 09:55:28
【问题描述】:
我在NSValue 中存储了一个NSInteger,在取回该值时,我得到了一个垃圾值。有趣的是,我在 iPhone 6 上得到了这个垃圾值,而在 iPhone 5 上得到了正确的值。
这是我的代码的一部分:
NSValue *unknown = nil;
[self getValueForUnknown:&unknown];
if (unknown) {
NSInteger unknownInt;
[unknown getValue:&unknownInt];
NSLog(@"%lu", (unsigned long)unknownInt); // prints the correct value on iPhone 5 but a garbage value on iPhone 6
}
...
- (void)getValueForUnknown:(NSValue **)unknownArg {
int x = 0;
*unknownArg = [NSValue value:&x withObjCType:@encode(int)];
}
注意:两个设备都在运行iOS 9.3.1
【问题讨论】:
-
使用
NSLog(@"%lu", (unsigned long)unknownInt);会发生什么? -
它在 iPhone 5 上运行时打印值 0,但在 iPhone 6 上打印一个垃圾值。
-
你确定吗?它们都是 64 位的吗?
-
只是一个快速的谷歌搜索显示 iPhone 5 是 32 位,而 iPhone 6 是 64.. 但仍然
NSInteger应该能够保持int,64 位与否:-/跨度> -
问题是在 32 位和 64 位平台下使用
%lu和NSInteger。您始终需要将其转换为unsigned long。