は、未実装方法は、以下の方法で解決さ:実装されていないメソッドが解決されるプロセスを決定する要因は何ですか?私はそれを理解したよう
- resolveInstanceMethod:/ resolveClassMethod:メソッドを実装するための機会を得る
- forwardingTargetForSelector:デリゲートに転送する機会を得ます
- 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
は財団で何をしているのですか?
あなたのニーズは何ですか?そして、なぜあなたは 'NSInvocation'があまりにも重すぎると思いますか?私はあなたが「NSInvocation」があなたを減速させていることが確かにわからない限り、車輪を再発明しないことを勧めます。 –
私はObject-cとのインタフェースにメッセージ転送を使用するスクリプト言語のようなものを少し書いています。今のところ、私はNSInvocationを使用していますが、1秒間に何千回もかかることになり、オーバーヘッドが顕著になります。しかし、私はちょうど興味があると思います... –
FWIW、objc_msgForward()は、ターゲットプラットフォーム/アーキテクチャに従ってアセンブリで実装されています:http://opensource.apple.com/source/objc4/objc4-437.1/runtime/ Messengers.subproj/ –