【问题标题】:NSNumber to NSInteger going from 2 to 528839664NSNumber 到 NSInteger 从 2 到 528839664
【发布时间】:2016-05-06 05:41:46
【问题描述】:

我正在从 plist 中读取一堆 NSNumber 值,而我向您展示的代码中的第一行对于stoneOne[@"Column"] 的值为 2。当我在第二行为“c”设置断点并检查 [c intValue] 时,c 正确为 int 2。但是,当我分析 NSInteger 列的值时,该值为 528839664。这有什么原因吗?我不应该得到 c 的 intValue 吗?有必要吗? (我认为要将 NSNumber 值转换为可读的 NSInteger 值,您必须调用该方法)。

    NSNumber* c = stoneOne[@"Column"];
    NSInteger column = [c intValue];

【问题讨论】:

  • 我的第一个猜测是您正在使用调试器进行检查并得到意外结果,因为您正在寻找“太早”,即代码行尚未执行,正在查看其他内容(其他可能是全局的)变量或其地址,或者陷入调试优化构建时得到奇怪结果的陷阱,这有时会给具体的代码行带来问题,因为它们的执行顺序可能会被打乱。
  • 仅供参考 - 不要混合类型。如果columnNSInteger,请使用[c integerValue]。如果要使用intValue,请将column 的类型更改为int

标签: ios objective-c nsnumber


【解决方案1】:

好的,有两件事。

正如 Eiko 指出的那样,您需要转到下一行,以确保执行像 NSInteger column = [c intValue]; 这样的赋值。只需提前一步,或将断点放在它下面的行中。

其次,使用NSInteger column = [c integerValue];优化转换为NSInteger。

【讨论】:

  • intValue 和 integerValue 非常相似,而且通常完全相同。无论如何,两者都足够宽,可以毫无问题地捕获“2”。 ;-)(即使很重要,“528839664”也适合。)。
  • @Eiko 推荐使用integerValue 是一个很好的建议,因为column 被声明为NSInteger。当然,它与眼前的问题没有直接关系。这是正确的做法。不要不必要地混合和匹配类型。
  • @rmaddy 完全同意不混合类型。不过,将列设为“int”可能同样有效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-08
  • 1970-01-01
  • 2017-01-03
  • 1970-01-01
  • 2023-04-04
  • 1970-01-01
相关资源
最近更新 更多