runtime使用編:class_respondsToSelector、respondsToSelectorおよびinstancesRespondToSelector
2488 ワード
前言:この記事では、以下の3つの作用が似ている関数または方法の使用、およびそれらの具体的な使用の違いについて説明します. 3つの関数メソッドの役割は,いずれもあるメソッドに応答したか,あるいはあるメソッドが実現されたかを判断することである.これらは、クラスまたはクラスのインスタンスをパラメータまたは呼び出しとして使用する必要があります.まず、クラス
それぞれの
1 .
注意:上記のすべての結論は、サブクラスにも適用されます.たとえば、サブクラス
BOOL class_respondsToSelector(Class cls, SEL sel)
- (BOOL)respondsToSelector:(SEL)aSelector;
//メソッド宣言NSObject
プロトコルにおける+ (BOOL)instancesRespondToSelector:(SEL)aSelector;
//メソッド宣言NSObject
クラスにおける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
を定義します.LittlePerson
にPerson
のクラスメソッドとインスタンスメソッドが書き換えられていなくても、Person
のクラスメソッドとインスタンスメソッドはPerson.h
ファイルで宣言されていませんが、サブクラスは親のプライベートメソッドに応答できます.