instancesRespondToSelector:和respondsToSelector:

官方介紹如下
不能通過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:…]; 等價。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章