官方介紹如下
不能通過super關鍵字向對象發送respondsToSelector:來測試對象是否從其超類繼承方法。這個方法不僅僅對對象的超類的實現測試,也會測試整個對象的類的實現。因此,向super發送respondsToSelector:相當於將其發送給自己。
如果想測試超類是否實現了某個方法, 必須直接在對象的超類上調用NSObject的類方法instancesRespondToSelector:,如以下代碼片段所示。
if([MySuperclass instancesRespondToSelector:@selector(aMethod)]){
//調用繼承的方法
[super aMethod];
}
你不能簡單地使用[[self superclass] instancesRespondToSelector:@selector(aMethod)],因爲如果它被子類調用,這可能會導致方法失敗。
注意,如果接收器能夠將aSelector消息轉發到另一個對象,而且被轉發的對象也能夠響應該消息,儘管是間接的,那麼這個方法也將返回NO。
看到某個博客上的總結挺好,抄錄如下
https://www.jianshu.com/p/bf8422d53b88
- instancesRespondToSelector 爲類方法,respondsToSelector 是協議方法,類和實例都可調用。
- 類調用 respondsToSelector 用於判斷是否包含某個類方法,實例調用 respondsToSelector - 用於判斷是否包含某個實例方法。
- 類調用 instancesRespondToSelector 用於判斷該類的實例是否包含某方法,等效於該類的實例調用 respondsToSelector。
- 在一個類中不可以通過 [super respondsToSelector:…]; 的方式判斷父類中是否實現或繼承了某個方法,因爲這個方法會檢測整個類,和 [self respondsToSelector:…]; 等價。