2011-01-29 23 views
6

は、未実装方法は、以下の方法で解決さ:実装されていないメソッドが解決されるプロセスを決定する要因は何ですか?私はそれを理解したよう

  1. resolveInstanceMethod:/ resolveClassMethod:メソッドを実装するための機会を得る
  2. forwardingTargetForSelector:デリゲートに転送する機会を得ます
  3. forwardInvocation:メソッドが適切であると見なして処理する機会を得ます。

この3段階プロセスはどこに定義されていますか?私はNSInvocationが私のニーズにはあまりにも重すぎるかもしれないので、私はそれを自分で処理したいと思います。私はランタイムソースの周りに酔っぱらいがあり、本当に何も見ることができません。

古いランタイムが前方を呼び出しているようです:args:これを行うには受信側で、新しいものから行ったようです。私は、実行時ではなくフレームワークでプロセスを定義しなければならないと推測しています。ランタイムがCocoaに依存してメッセージを処理するためにNSInvocationを必要とする範囲であれば奇妙です。 NSObject/NSProxyで呼び出される、文書化されていないメソッドですか?

編集:「私はドン

id objc_msgForward(id object,SEL message,...);

これは、objc_msgSendの実装を見つけることができないときに呼び出されるC関数、ランタイムは宣言するように見えますが、定義されたことがありませんアップルのために働くので、私はFoundationがこれをどのように実装しているのか分かりませんが、少なくともCocotronの場合、彼らは以下を使用します:

id objc_msgForward(id object,SEL message,...) 
{ 
    Class  class=object->isa; 
    struct objc_method *method; 
    void  *arguments=&object; 

    if((method=class_getInstanceMethod(class,@selector(forwardSelector:arguments:)))!=NULL) 
     return method->method_imp(object,@selector(forwardSelector:arguments:),message,arguments); 
    else 
    { 
     OBJCRaiseException("OBJCDoesNotRecognizeSelector","%c[%s %s(%d)]", class_isMetaClass(class) ? '+' : '-', class->name,sel_getName(message),message); 
     return nil; 
    } 
} 

forwardSelector:arguments:メソッドを追加しても機能しないようですので、これはCocotron固有のものです。誰でも、objc_msgForwardは財団で何をしているのですか?

+0

あなたのニーズは何ですか?そして、なぜあなたは 'NSInvocation'があまりにも重すぎると思いますか?私はあなたが「NSInvocation」があなたを減速させていることが確かにわからない限り、車輪を再発明しないことを勧めます。 –

+0

私はObject-cとのインタフェースにメッセージ転送を使用するスクリプト言語のようなものを少し書いています。今のところ、私はNSInvocationを使用していますが、1秒間に何千回もかかることになり、オーバーヘッドが顕著になります。しかし、私はちょうど興味があると思います... –

+1

FWIW、objc_msgForward()は、ターゲットプラットフォーム/アーキテクチャに従ってアセンブリで実装されています:http://opensource.apple.com/source/objc4/objc4-437.1/runtime/ Messengers.subproj/ –

答えて

6

私は少し Objective-Cのとインタフェースするメッセージ 転送を使用しています スクリプト言語のようなものを書いています。今のところ、私は NSInvocationを使用していますが、 秒あたりこの何千回も何千も何千ということがありますので、オーバーヘッドは になります。しかし、私は、私もちょうど 好奇心が強いと思うよ...

は限りメッセージの転送に関しては、動作は[しばしば微妙]異なるプラットフォームやランタイムのバージョン間で異なっています。

いずれにしても、ホイールを再発明しないでください。現在入手可能な2つの言語ブリッジがあり、完全に忠実なブリッジングに非常に近く、トンから学ぶことができます。両方とも、そのような再利用を可能にするための特別なライセンスを持っています。

特に、MacRubyプロジェクトは、CoreFoundationとObjective-Cガベージコレクタの上にあるRuby実装を提供します。それは利用可能な「最もネイティブな」ブリッジです(その結果、ひどく移植されるものではなく、プロジェクトの目標ではありません)。

PyObjCブリッジは、Objective-Cランタイムと別の動的OO言語のランタイム間の高性能ブリッジで使用できる最良の例です。 Python。Mac OS X以外のビットは多少腐っている可能性はあるものの、もう少し移植性があります。

(?私はF-スクリプトを言及しないで怠慢だろう;のためのObjective-C、私は信じて、ソースがある/上に構築された新しい言語が利用可能であった)

ブリッジのすべては、両方の方法で対処しますフォワーディング、サブクラス化、およびクロスランタイムプロキシ処理が含まれています。

+0

Fスクリプトのソースは、http://www.fscript.orgのバイナリディストリビューションを含む同じ.zipファイルの中にあります。 – millenomi

+0

FスクリプトのソースコードはGitHubでも入手できます:https://github.com/pmougin/F-Script – 0xced

+0

私はそれを考えなかった。 –

関連する問題