3

当 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 响应的选择器的响应,我应该期望什么样的性能损失.

任何指向信息来源的指针表示赞赏!

4

2 回答 2

9

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

isKindOfClass: compares the isa pointers of both classes. If that fails, it repeats with the superclass, which is just the field 'super_class' in the struct objc_class.

So the proper way to distinguish between two objects is isKindOfClass:.

Note that processing your JSON data will be gazillion times slower than everything above. Not finding a selector doesn't bring the system to a halt or anything.

于 2012-08-25T01:34:13.213 回答
5

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

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

于 2012-08-24T23:05:42.727 回答