runtime使用編:class_respondsToSelector、respondsToSelectorおよびinstancesRespondToSelector

2488 ワード

前言:
  • この記事では、以下の3つの作用が似ている関数または方法の使用、およびそれらの具体的な使用の違いについて説明します.BOOL class_respondsToSelector(Class cls, SEL sel) - (BOOL)respondsToSelector:(SEL)aSelector;//メソッド宣言NSObjectプロトコルにおける+ (BOOL)instancesRespondToSelector:(SEL)aSelector;//メソッド宣言NSObjectクラスにおける
  • 3つの関数メソッドの役割は,いずれもあるメソッドに応答したか,あるいはあるメソッドが実現されたかを判断することである.これらは、クラスまたはクラスのインスタンスをパラメータまたは呼び出しとして使用する必要があります.まず、クラスPersonを作成し、クラスにいくつかの方法を追加します.方法の例は次のとおりです.
    // Person.h
    @interface Person : NSObject
    //    
    @end
    
    // Person.m
    @implementation Person
    + (void)run
    {
        NSLog(@"run");
    }
    - (int)ages
    {
        return 30;
    }
    @end
    

    それぞれのBOOL値の印刷結果は、各行の後ろに表示されます.
    Person *p = [[Person alloc] init];
    
    BOOL yn1 = class_respondsToSelector([Person class], @selector(ages)); // YES
    BOOL yn2 = class_respondsToSelector([Person class], @selector(run)); // NO
    BOOL yn3 = [[Person class] respondsToSelector:@selector(ages)]; // NO
    BOOL yn4 = [[Person class] respondsToSelector:@selector(run)]; // YES
    BOOL yn5 = [p respondsToSelector:@selector(ages)]; // YES
    BOOL yn6 = [p respondsToSelector:@selector(run)]; // NO
    BOOL yn7 = [[Person class] instancesRespondToSelector:@selector(ages)]; // YES
    BOOL yn8 = [[Person class] instancesRespondToSelector:@selector(run)]; // NO
    

    1 . class_respondsToSelector関数パラメータは1つのクラスに入力する必要があるが、yn1およびyn2の結果から、この関数が入力クラスで指定された『インスタンスメソッド』が実現されたか否かを判断するものであることがわかる.2 . respondsToSelectorメソッド宣言NSObjectプロトコルにおいて、呼び出し者はインスタンスであってもクラスであってもよい:yn3およびyn4の結果から、呼び出し者がクラスである場合、このメソッドは、このクラスで指定された「クラスメソッド」が実現されたか否かを判断することである.yn5およびyn6の結果から分かるように、呼び出し元がクラスのインスタンスである場合、このメソッドは、そのクラスにおいて指定された『インスタンスメソッド』が実現されたか否かを判断するものである.3 . instancesRespondToSelectorメソッドはNSObjectクラスに宣言されクラスメソッドであり、クラス呼び出しのみであり、yn7およびyn8の結果から、クラスで指定された『インスタンスメソッド』が実現されたか否かを判断する方法であることがわかる.class_respondsToSelector関数とinstancesRespondToSelectorメソッドは同じ役割を果たし,respondsToSelectorメソッドがインスタンスによって呼び出された場合と同じ役割を果たすことが分かった.
    注意:上記のすべての結論は、サブクラスにも適用されます.たとえば、サブクラスLittlePerson継承クラスPersonを定義します.LittlePersonPersonのクラスメソッドとインスタンスメソッドが書き換えられていなくても、PersonのクラスメソッドとインスタンスメソッドはPerson.hファイルで宣言されていませんが、サブクラスは親のプライベートメソッドに応答できます.