【问题标题】:NSValue getValue: method returns garbage value on iPhone 6 but correct value on iPhone 5NSValue getValue:方法在 iPhone 6 上返回垃圾值,但在 iPhone 5 上返回正确值
【发布时间】: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 位平台下使用 %luNSInteger。您始终需要将其转换为 unsigned long

标签: ios nsvalue


【解决方案1】:

我参考了 Apple Docs 以了解 NSValue 的正确用法并发现:

我试图将int 的值返回到NSInteger 变量中,在将unknownInt 声明为int 之后,现在一切正常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多