gpt4 book ai didi

objective-c - 使用 respondsToSelector 的性能损失

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:52:20 25 4
gpt4 key购买 nike

我将重构大量旧代码,使客户端对错误的服务器响应更加健壮,并在 JSON 响应具有无效值时记录异常,并且我正在考虑检查每个正在解析的节点的有效性(数据类型)使用 respondsToSelector。

我正在检查响应中的数据类型(int、bool 等)

[[json objectForKey: @"feature_enabled"] boolValue], 

如果 @"feature_enabled"节点的值不是 0 或 1,这会使应用程序崩溃

为了解决这个问题,我会这样做

if ([[json objectForKey: @"feature_enabled"] respondsToSelector: @selector(boolValue)]){
BOOL featureEnabled = [[json objectForKey: @"feature_enabled"] boolValue];
}else{
Log Exception
}

我没有对这段代码进行任何类型的性能分析,但我想知道是否有人可以建议如果我要检查对每个 JSON 响应的选择器的响应,我应该期望什么样的性能损失打算解析。

感谢任何指向信息来源的指针!

最佳答案

respondsToSelector: 检查 nil。它不是零,它调用IMP lookUpMethod(Class cls, SEL sel, BOOL initialize, BOOL cache, id inst)从 IMP 缓存返回方法(使用 CacheLookup 宏)。如果找不到,它会尝试填充缓存,在类本身中查找方法,这涉及对父类(super class)重复操作。如果失败,它会运行 forwarding mechanism .

isKindOfClass: 比较两个类的 isa 指针。如果失败,它会重复父类(super class),即 struct objc_class 中的字段“super_class” .

所以区分两个对象的正确方法是isKindOfClass:

请注意,处理您的 JSON 数据将比上述所有内容慢 gazillion 倍。找不到选择器不会使系统停止或发生任何事情。

关于objective-c - 使用 respondsToSelector 的性能损失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12117670/

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