Objective C/iOSが非常に動的な言語であることを理解する限り、Rubyほど動的ですか?それにはmethod_missingと同等のものがありますか?私はjs Does Javascript have something like Ruby's method_missing feature?について同じ質問をしましたが、jsがまだそれをサポートしていないことには失望しました。Objective C/iOSのruby method_missingに相当する
答えて
の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
私は、method_missingはオブジェクトに特定のメソッドが見つからないときに呼び出されるコールバックメソッドだと思います。さて、respondsToSelectorメソッドを使って、オブジェクトがメソッドに応答できるかどうかを調べることができます。 NSObjectプロトコルで宣言されたメソッドです。だから、method_missingを呼び出す代わりに、いくつかのメソッドが見つからないことを知った後で、beforehandsをチェックすることができます。
if ([myObject respondsToSelector:@selector(someMethodThatMightBeMissing:)])
NSLog(@"The method is missing");
Objective-Cの 'respondsToSelector:'は 'method_missing'ではなく' respond_to? 'に対応しています。 – louielouie
あなたは私が初心者の感謝として判断できないので、違いは何ですかlouielouieより簡単です:) – user310291
私が提案したものは、オブジェクトがメソッドに応答できるかどうかを確認するのに役立ちます。ほとんどの場合、このメソッドは、オブジェクトがメソッドに応答しない可能性があると思われる場合に使用します。これは予防策のようなものです。オブジェクトまたはその前身にこのようなメソッドがない場合、プログラムがクラッシュします。しかし、オブジェクトがそれに応答するという条件だけでメソッドを呼び出すと、プログラムがクラッシュするのを防ぐことができます。 method_missingメソッドは、私が理解する限り、このような状況が発生したときに呼び出され、プログラムがクラッシュすることがないようにするメソッドです。前者はチンキン用、後者はケースを処理するためのメソッドです。 –
私は同じメソッドを追加する例に基づいてこのパターンを実装しましたUITextField
とUITextView
サブクラスに:https://stackoverflow.com/a/19661059/171933
お楽しみください!
- 1. Rubyの 'method_missing'に相当するPython
- 2. Rubyシンボルに相当するObjective-C
- 3. Ruby - method_missing
- 4. Rubyに相当するPython "_"
- 5. Objective-Cに相当するC#のオーバーライド
- 6. Objective-Cの@ "string"に相当するPHP
- 7. Objective-Cに相当するJavaのInteger.toOctalString()?
- 8. Objective-Cに相当するJavaのBlockingQueue?
- 9. Objective-C/Cocoaに相当するC#ManualResetEvent
- 10. ruby file_get_contents相当の
- 11. Pygame相当のRuby?
- 12. SwiftのObjective-C __strong相当
- 13. Objective-C相当のJavaバイト[]
- 14. Rubyのサンドイッチブロックコードに相当するC#式。
- 15. Rubyのa ||に相当するJQuery b
- 16. PHPの$に相当するRuby
- 17. RubyのString#scanに相当するJavaScript
- 18. Rubyの "pass"に相当する
- 19. Ruby Array.eachメソッドに相当するPython
- 20. PythonでRuby on Railsに相当する
- 21. Zend_Form ruby/railsに相当する
- 22. groovy(ruby)に相当するsortby?
- 23. C++ enumに相当するRuby/Rails
- 24. metric_fu ruby 1.9.xに相当する
- 25. Pythonに相当するRuby `if __FILE__ == $ PROGRAM_NAME`
- 26. Rubyに相当するC++ Const?
- 27. Rubyのirb相当のPerl?
- 28. Rubyは "相当"です
- 29. RubyのGemfile相当物
- 30. RubyのcURLに相当しますか?
+1は完璧な答えです! – Vignesh
[メッセージ転送]のセクションも参照してください(https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/ocrtForwarding.html#//apple_ref/doc/uid/TP40008048- CH105)をObjective-Cランタイムガイドに追加しました。 –