使用respondsToSelector的性能损失

Nit*_*bur 2 performance xcode objective-c ios respondstoselector

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

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

[[json objectForKey: @"feature_enabled"] boolValue], 
Run Code Online (Sandbox Code Playgroud)

如果@"feature_enabled"节点具有0或1以外的任何值,则会导致应用程序崩溃

为了解决这个问题,我就是这样做的

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

我没有对这段代码做过任何形式的性能分析,但是我想知道是否有人可以建议如果我要检查响应选择器的每一个JSON响应我打算解析的性能损失是什么样的.

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

Jan*_*ano 8

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

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

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

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


roo*_*117 5

你可能想考虑使用isKindOfClass,我相信这是最好的表现:

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

  • 实际上-isMemberOfClass:会检查isa.-isKindOfClass:还需要检查所有超类的isa. (3认同)
  • 同意.`-isKindOfClass:`只需要检查`Class*isa`指针,其中`-respondsToSelector:`可能会执行一些运行时的东西. (2认同)