2012-03-21 9 views

答えて

16

のObjective-Cは、Rubyのプログラマでしたが、動的であり、私はそれがRubyのほどダイナミックではないと言うでしょう。

Objective-Cには、method_missingと同等の機能があります。あなたのオブジェクト自体はあなたがmethodSignatureForSelectorをオーバーライドする必要があり、認識されない方法に対応するため

重要:あなたはforwardInvocation:methodSignatureForSelector:の両方をオーバーライドして、アップルからこの重要なアドバイスに従うことになるでしょうforwardInvocationに加えて:.メッセージを転送するメカニズムでは、methodSignatureForSelector:から取得した情報を使用して、転送するNSInvocationオブジェクトを作成します。オーバーライドするメソッドは、セレクタを事前に作成するか、別のオブジェクトに要求することによって、指定されたセレクタに対して適切なメソッドシグネチャを提供する必要があります。

Appleはit must always result in an exception being thrown.

は、さらに詳細については、NSObjectクラスのドキュメントを参照してくださいことを警告としてdoesNotRecognizeSelector:を使用しないでください:http://developer.apple.com/library/ios/#DOCUMENTATION/Cocoa/Reference/Foundation/Classes/NSObject_Class/Reference/Reference.html

+0

+1は完璧な答えです! – Vignesh

+1

[メッセージ転送]のセクションも参照してください(https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/ocrtForwarding.html#//apple_ref/doc/uid/TP40008048- CH105)をObjective-Cランタイムガイドに追加しました。 –

-1

私は、method_missingはオブジェクトに特定のメソッドが見つからないときに呼び出されるコールバックメソッドだと思います。さて、respondsToSelectorメソッドを使って、オブジェクトがメソッドに応答できるかどうかを調べることができます。 NSObjectプロトコルで宣言されたメソッドです。だから、method_missingを呼び出す代わりに、いくつかのメソッドが見つからないことを知った後で、beforehandsをチェックすることができます。

if ([myObject respondsToSelector:@selector(someMethodThatMightBeMissing:)]) 
    NSLog(@"The method is missing"); 
+0

Objective-Cの 'respondsToSelector:'は 'method_missing'ではなく' respond_to? 'に対応しています。 – louielouie

+0

あなたは私が初心者の感謝として判断できないので、違いは何ですかlouielouieより簡単です:) – user310291

+0

私が提案したものは、オブジェクトがメソッドに応答できるかどうかを確認するのに役立ちます。ほとんどの場合、このメソッドは、オブジェクトがメソッドに応答しない可能性があると思われる場合に使用します。これは予防策のようなものです。オブジェクトまたはその前身にこのようなメソッドがない場合、プログラムがクラッシュします。しかし、オブジェクトがそれに応答するという条件だけでメソッドを呼び出すと、プログラムがクラッシュするのを防ぐことができます。 method_missingメソッドは、私が理解する限り、このような状況が発生したときに呼び出され、プログラムがクラッシュすることがないようにするメソッドです。前者はチンキン用、後者はケースを処理するためのメソッドです。 –