2012-07-20 15 views
14

自分で見た唯一の違いは、instancesRespondToSelectorはクラスレシーバしか持つことができないが、respondsToSelectorのレシーバはクラスまたはインスタンスのどちらでもかまいません。それ以外に何が違うの?いずれかのパフォーマンス上の問題はありますか?Objective-CのinstancesRespondToSelectorとrespondsToSelectorの違いは何ですか?

+0

respondsToSelectorの受信者はインスタンスオブジェクトにしかなりません。 instancesRespondToSelectorの受信者は、Classオブジェクトでなければなりません。 +または - はメソッドのタイプに差をつけます – Karthick

答えて

24

-[NSObject respondsToSelector:]にする必要がありこのように実装されています

+ (BOOL)instancesRespondToSelector:(SEL)aSelector { 
    return class_respondsToSelector(self, aSelector); 
} 

- (BOOL)respondsToSelector:(SEL)aSelector { 
    return class_respondsToSelector([self class], aSelector); 
} 

+[Class instancesRespondToSelector:]はこのように実装されています

(CoreFoundationでHopperを使用しました)

したがって、基本的に違いはありません。ただし、インスタンスごとにYESまたはNOを返すように、自分のクラスでrespondsToSelector:をオーバーライドすることができます(NSProxyがこれを行います)。 instancesRespondToSelector:でこれを行うことはできません。

+2

少しの発言、 'instancesRespondToSelector:' ** **できます**(**メッセージ転送メカニズムを実装する場合は**必須**)は上書きされます。 [Objective-Cランタイムプログラミングガイド、転送と継承のセクション]を参照してください(https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/ocrtForwarding.html) – Lexandr

+0

@rob_mayoff私は完全に知っていますあなたがここで言っていることですが、ちょっとしたことです。最初のステートメントで[NSObject respondsToSelector:]がありますが、NSObject自体はクラス名なので少し混乱します。あなたはNSObjectInstanceを正しく意味しましたか? – pnizzle

+0

NSObjectクラスで定義されたインスタンスメッセージ(NSObjectのインスタンスまたはそのサブクラスに送信可能なメッセージ)を参照するときには、 - [NSObject respondsToSelector:] 'と書くのが一般的です。 'NSObject'クラスによって定義されたクラスメッセージを参照するために' + [NSObject instancesRespondToSelector:] 'と書いています。 –

9

1つの違いは、インスタンスがそのスーパークラスからメソッドを継承する場合respondsToSelectorはあなたを伝えることはできませんので、あなたが[super respondsToSelector:_cmd];ような何かをしたい場合は、それは文句を言わない仕事、あなたは、ボンネットの下に[[self superclass] instancesRespondToSelector:_cmd];

+0

Hm、大丈夫です。しかしObjective-Cの継承セマンティクスのためではありませんが、実際には2つの方法の違いはありませんか?なぜなら、あなたの例で私が間違っていなければ、 '[[self superclass] respondsToSelector:_cmd];'が動作するからです。 –

+0

いいえ、respondsToSelector:というクラスにメソッドがないためです。 respondsToSelectorはNSObjectプロトコルの一部であり、クラスは – wattson12

+0

@ wattson12 'NSObject'に準拠せず、そのサブクラスは' + respondsToSelector: 'クラスメソッドに応答します。 –

4

respondsToSelector:インスタンス方法であり、クラス又はクラスのオブジェクトのインスタンスとすることができるオブジェクトは、選択に応答するかどうかを判断します。インスタンスメソッドをテストしているインスタンスを渡すと、クラスオブジェクトを渡すときにクラスメソッドをテストしています。

instancesRespondToSelector:は、クラスメソッドであり、クラスのインスタンスがセレクタに応答するかどうかを決定します。これはクラスを与えられたインスタンスメソッドのテストを可能にし、はそのクラスのインスタンスを持つなしでテストできます。