gpt4 book ai didi

ios - NSString decimalValue 方法

转载 作者:行者123 更新时间:2023-11-29 12:14:28 26 4
gpt4 key购买 nike

我在一个项目中遇到了一些旧代码,我不明白为什么它没有崩溃。

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

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

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

是否存在我不理解的运行时行为?强制转换是否会导致使用不同类的方法?

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

最佳答案

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

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

但是,如果您使用 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 和 friend ,或者与 NSNumberFormatter 一起使用。

关于ios - NSString decimalValue 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32343007/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com