NSNumber 到 NSInteger 从 2 到 528839664

Posted

技术标签:

【中文标题】NSNumber 到 NSInteger 从 2 到 528839664【英文标题】:NSNumber to NSInteger going from 2 to 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 【参考方案1】:

好的,有两件事。

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

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

【讨论】:

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

以上是关于NSNumber 到 NSInteger 从 2 到 528839664的主要内容,如果未能解决你的问题,请参考以下文章

int vs NSNumber vs NSInteger

Cocoa - 为啥使用 NSInteger 和 CGFloat 而不是使用 int 和 float,或者总是使用 NSNumber?

NSInteger 发布

iCloud 数据错误

NSNumber 与 Int

iOS NSMutableArray添加NSInteger元素