全网营销销售,郑州seo网站管理,网站制作很好 乐云践新,wordpress 前台注册前情
在iOS开发中#xff0c;经常需要将事件传递给上层代理去处理#xff0c;这个时候会用到『respondsToSelector』去检测上层代理是否有实现对应的方法#xff0c;如果实现了#xff0c;才会去调用。
- (void)methodExample {if ([self.delegate respondsToSelector:se…前情
在iOS开发中经常需要将事件传递给上层代理去处理这个时候会用到『respondsToSelector』去检测上层代理是否有实现对应的方法如果实现了才会去调用。
- (void)methodExample {if ([self.delegate respondsToSelector:selector(cell:didClickOnUserInfo:)]) {[self.delegate cell:self didClickOnUserInfo:self.item];}
}而项目中很少直接调用respondsToSelector而是调用了一个宏。
#define PackageRespondsToSelector(delegate,selector) ((delegate) ([delegate respondsToSelector:selector]))- (void)methodExample {if (PackageRespondsToSelector(self.delegate, selector(cell:didClickOnUserInfo:))) {[self.delegate cell:self didClickOnUserInfo:self.item];}
}可以从宏的定义里发现实际上就是在调用系统respondsToSelector方法前先对方法调用者delegate进行了一个判空操作。
但实际上我们开发时是否需要这个判空操作
实测
- (void)method1 {if ([self.delegate respondsToSelector:selector(cell:didClickOnUserInfo:)]) {[self.delegate cell:self didClickOnUserInfo:self.item];}
}- (void)method2 {if (self.delegate ([self.delegate respondsToSelector:selector(cell:didClickOnUserInfo:)])) {[self.delegate cell:self didClickOnUserInfo:self.item];}
}当 self.delegate 不为 nil 时method1 和 method2 效果肯定是等价的 当 self.delegate 为 nil 时 ** 先看method2self.delegate为nil都不会去执行后面的判断而直接返回NO。 ** 再看method1nil调用respondsToSelector方法会返回什么
直接写个demorun起来后发现 fanHuiZhi 为 NO。可知nil调用respondsToSelector方法会返回NO。
- (void)methodDemo {self.delegate nil;BOOL fanHuiZhi [self.delegate respondsToSelector:selector(cell:didClickOnUserInfo:)]if (fanHuiZhi) {[self.delegate cell:self didClickOnUserInfo:self.item];}
}参考 https://www.jianshu.com/p/11dca953f962 中的说法。nil调用方法 返回什么取决于该方法的返回值类型。respondsToSelector方法的返回值类型为BOOL所以[nil respondsToSelector:xxx]会得到NO 故可以知道self.delegate 为 nil 的时候if 判断都是 NO不会去调用代理方法故 method1和 method2等价。 不论 self.delegate 是否为 nilmethod1和 method2都是等价的调用封装的宏PackageRespondsToSelector和直接调用系统api respondsToSelector是一样的。
结论使用respondsToSelector方法前不需要对方法调用者进行判空操作