【iOS】使用respondsToSelector方法前是否需要对方法调用者进行判空操作?

前情

在iOS开发中,经常需要将事件传递给上层代理去处理,这个时候会用到『respondsToSelector』去检测上层代理是否有实现对应的方法,如果实现了,才会去调用。

objectivec 复制代码
- (void)methodExample {
    if ([self.delegate respondsToSelector:@selector(cell:didClickOnUserInfo:)]) {
        [self.delegate cell:self didClickOnUserInfo:self.item];
    }
}

而项目中,很少直接调用respondsToSelector,而是调用了一个宏。

objectivec 复制代码
#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进行了一个判空操作。

但实际上我们开发时是否需要这个判空操作?

实测

objectivec 复制代码
- (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 时:

** 先看method2,self.delegate为nil,都不会去执行后面的判断,而直接返回NO。

** 再看method1,nil调用respondsToSelector方法,会返回什么?

直接写个demo,run起来后,发现 fanHuiZhi 为 NO。可知nil调用respondsToSelector方法,会返回NO。

objectivec 复制代码
- (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 是否为 nil,method1和 method2都是等价的,调用封装的宏PackageRespondsToSelector和直接调用系统api respondsToSelector是一样的。

结论:使用respondsToSelector方法前不需要对方法调用者进行判空操作

相关推荐
初级代码游戏3 小时前
iOS开发 Swift 速记2:三种集合类型 Array Set Dictionary
开发语言·ios·swift
凡泰AI6 小时前
APP同时覆盖了iOS、安卓和鸿蒙,如何选择混合开发架构才能减少重复建设,提高功能上线效率~
android·ios·harmonyos·mpaas·uni·小程序容器
AIsoft_868811 小时前
iPhone录音重点标记:会议录音与重点内容同步保存功能实测
ios·iphone
00后程序员张11 小时前
使用Instruments工具深入分析iOS应用性能与启动时间优化
android·macos·ios·小程序·uni-app·cocoa·iphone
90后的晨仔13 小时前
Xcode 26.6编译 AFNetworking 报错全解:5 种方案从应急到根治
ios
初级代码游戏1 天前
iOS开发 Swift 速记1:变量和基本数据类型
开发语言·ios·swift
for_ever_love__1 天前
iOS:网络请求再学习
网络·学习·ios·objective-c
2501_915921431 天前
SwiftUI开发框架入门指南:从基础到实战
ide·vscode·ios·objective-c·个人开发·swift·敏捷流程
2501_916007471 天前
Python实现HTTPS爬虫的完整指南:使用requests、BeautifulSoup、Selenium和Scrapy
爬虫·python·ios·小程序·https·uni-app·iphone
LDyun_2 天前
云手机低延迟怎么实现的?为什么云手机能够 7×24 小时在线?
ios·智能手机·安卓·玩游戏