私が自分で観察した唯一の違いは、respondsToSelectorのレシーバーはクラスまたはインスタンスのいずれかでありinstancesRespondToSelector、クラスレシーバーしか持てないことです。しかし、他に何が違うのですか?どちらか一方にパフォーマンス上の問題はありますか?
3 に答える
内部的に-[NSObject respondsToSelector:]は、次のように実装されています。
- (BOOL)respondsToSelector:(SEL)aSelector {
return class_respondsToSelector([self class], aSelector);
}
そして、+[Class instancesRespondToSelector:]次のように実装されています:
+ (BOOL)instancesRespondToSelector:(SEL)aSelector {
return class_respondsToSelector(self, aSelector);
}
(これを理解するために CoreFoundation のHopperを使用しました。)
というわけで、基本的に違いはありません。ただし、respondsToSelector:独自のクラスでオーバーライドして、インスタンスごとに YES または NO を返すことができます (NSProxyこれを行います)。でそれを行うことはできませんinstancesRespondToSelector:。
1 つの違いはrespondsToSelector、インスタンスがそのスーパークラスからメソッドを継承しているかどうかを判断できないことです[super respondsToSelector:_cmd];。[[self superclass] instancesRespondToSelector:_cmd];
respondsToSelector:インスタンスメソッドであり、クラスまたはクラスオブジェクトのインスタンスである可能性のあるオブジェクトがセレクターに応答するかどうかを決定します。インスタンスを渡すとインスタンス メソッドをテストし、クラス オブジェクトを渡すとクラス メソッドをテストします。
instancesRespondToSelector:クラスメソッドであり、クラスのインスタンスがセレクターに応答するかどうかを決定します。クラスを指定して、そのクラスのインスタンスを持たずにインスタンス メソッドをテストできます。