好的,团队,这很奇怪。 [NSDecimalNumber integerValue]行为异常。

我坐在一个断点上,试图弄清为什么我的应用程序的某些部分在iOS8中被破坏了,我正在寻找一个名为“timeSeconds”的变量。在Xcode变量 View 中看起来像这样:

_timeSeconds    (NSDecimalNumber *) 344.514533996581994496

但是,当我在调试器中查询它时,会看到以下内容:
(lldb) p [self.timeSeconds doubleValue]
(double) $14 = 344.51453399658192
(lldb) p [self.timeSeconds intValue]
(int) $15 = 344
(lldb) p [self.timeSeconds integerValue]
(NSInteger) $16 = -5
(lldb) p (NSInteger)[self.timeSeconds intValue]
(NSInteger) $17 = 344

看到那个“-5”吗?在我提交雷达报告之前,你们中任何一个漂亮的人都能重现或解释吗?

这是SSCCE:
NSDecimalNumber *n = [NSDecimalNumber decimalNumberWithString:@"344.514533996581994496"];
NSLog(@"%@", n); // 344.514533996581994496
NSLog(@"%ld", (long)[n intValue]); // 344
NSLog(@"%ld", (long)[n integerValue]); // -5
NSLog(@"%ld", (long)[n unsignedIntegerValue]); // 12

提前致谢!

马修

最佳答案

integerValue 的结果令人惊讶,但据我所知:

NSDecimalNumber 继承自 NSNumber 。在 NSNumber 的子类注释中,指出
“...子类必须重写与声明的类型相对应的访问器方法,例如,如果您的objCType实现返回“i”,则必须重写intValue ...”

objCType 设置为内部指针,因此它应与 NSNumber 相同。

NSDecimal 不会覆盖 intergerValue
它确实覆盖了 doubleValue ,所以应该可以正常工作。

唯一让我感到疑惑的是:似乎它也没有覆盖 intValue ...

关于objective-c - {NSDecimalNumber integerValue}在iOS8中表现异常,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25705511/

10-09 18:31