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
.
一起使用
我 运行 进入项目中的一些旧代码,我不明白为什么它没有崩溃。
数据正在从 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
.