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];
【问题讨论】:
我的第一个猜测是您正在使用调试器进行检查并得到意外结果,因为您正在寻找“太早”,即代码行尚未执行,正在查看其他内容(其他可能是全局的)变量或其地址,或者陷入调试优化构建时得到奇怪结果的陷阱,这有时会给具体的代码行带来问题,因为它们的执行顺序可能会被打乱。 仅供参考 - 不要混合类型。如果column
是NSInteger
,请使用[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的主要内容,如果未能解决你的问题,请参考以下文章
Cocoa - 为啥使用 NSInteger 和 CGFloat 而不是使用 int 和 float,或者总是使用 NSNumber?