使用respondsToSelector的性能损失

时间:2012-08-24 22:57:15

标签: objective-c ios xcode performance respondstoselector

我将重构很多旧代码,以便在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响应的选择器响应时我应该期望的性能损失打算解析。

任何有关信息来源的指示表示赞赏!

2 个答案:

答案 0 :(得分:8)

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

isKindOfClass:比较两个类的isa指针。如果失败,则重复超类,这只是struct objc_class中的字段'super_class'。

因此区分两个对象的正确方法是isKindOfClass:

请注意,处理您的JSON数据将比上述所有内容慢几十倍。找不到选择器不会使系统停止运行。

答案 1 :(得分:5)

您可能需要考虑使用isKindOfClass,我认为这是最佳性能:

if([[yourDictionary objectForKey:@“yourKey”] isKindOfClass:[NSArray class]]) {     //假设它是一个数组并处理它 }

相关问题