NSString decimalValue 方法

NSString decimalValue method

我 运行 进入项目中的一些旧代码,我不明白为什么它没有崩溃。

数据正在从 HTTP 请求中提取到 API,某些值作为字符串返回,但被视为 NSNumber。例如,在下面的代码中,value 是一个 NSString。

[NSDecimalNumber decimalNumberWithDecimal:[(NSNumber *)value decimalValue]]

但是,它被错误地转换为 NSNumber,并调用了 NSNumber 的 decimalValue 方法。 NSString 没有 decimalValue 方法,所以我不明白为什么上面的行不会导致崩溃。当我用 [value isKindOfClass:[NSString class]][value isKindOfClass:[NSNumber class]] 检查 value 时,我得到了预期的结果。

是否有我不理解的运行时行为?转换是否会导致使用不同 class 的方法?

编辑 我正在更新这个问题的标题以更准确地反映这个问题。答案是 NSString 有一个导致混淆的私有 decimalValue 方法。

真正的答案? 巫术。不是真的,但有点。

cocoa 中的很多 类 在幕后都有私有方法。通常,这些方法大多不被注意,甚至很少使用。

但是,如果您使用 class_getMethodImplementation 获取它们的实现并使用 dladdr 打印符号的位置:

IMP theImp = class_getMethodImplementation([NSString class], @selector(decimalValue));
Dl_info info;
dladdr(theImp, &info);

puts(info.dli_sname);

您应该会看到类似 -[NSString(NSDecimalExtension) decimalValue] 的内容。

我最好的猜测是,此方法用于 KVO 和朋友在编组值 to/from 十进制值时,或者与 NSNumberFormatter.

一起使用