1

現在のインスタンスに存在しない場合にファイルシステムからそのオブジェクトをロードする準備ができるように、現在の関数の引数の名前を取得したいと思います。(たとえば、[foo dictTest]が利用できない場合は、以前に保存したplistバージョンを正確にそのivarにロードしたい)

現在の関数の引数として指定したivar名を指定してファイルを検索したいと思います。

これは機能コードです:

-(NSDictionary*)getCachedDictionary:(NSDictionary*)dict{

    NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[self methodSignatureForSelector:_cmd]];
    NSString * firstArgument = nil;
    [invocation getArgument:&firstArgument atIndex:2];
    NSLog(@"Trying to get the objects ivar %@",firstArgument);

    // right now during testing return nil
    return nil;
   }

コードがNSLogに到達するとすぐに、firstArgumentからnull値を取得します。

何故ですか?現在のメソッドが完全に呼び出されるのを待たなければならない可能性がありますか、それともsetArgumentで指定されたivar名を使用する呼び出しを介してクラスメソッドを暗黙的に呼び出すプロキシ関数を作成する方が実際には良いでしょう。その引数文字列を好きなように使用できますか?

よろしくお願いします!

PS:この特定の例では、KVCを使用してivarを識別して返すことはしたくありません。

4

2 に答える 2

2

NSInvocationAPI を誤解しました。メソッドシグネチャによって定義されたタイプの引数を受け入れるようにキー設定され+[NSInvocation invocationWithMethodSignature:]たnewを作成します。現在のメソッド呼び出しに対応するを返しNSInvocationません。NSInvocationこれは理由を理解するのは非常に簡単です:

- (void)doBar:(id)bip {
  NSLog(@"hi there!")
}

- (void)doFoo {
  NSMethodSignature *sig = [self methodSignatureForSelector:@selector(doBar:)];
  NSInvocation *i = [NSInvocation invocationWithMethodSignature:sig];
}

メソッドの呼び出しを作成するとき、doFoo実行されていないため、引数が空である必要があることは明らかです。したがって、引数はありません。に変更しても、魔法のように何も変更されません。doBar:doBar:@selector(doBar:)_cmd

では、次の質問:現在のメソッド呼び出しのを取得する方法はありますか?NSInvocation私が知っていることではありません。 NSInvocationは非常に複雑なクラスであり、現在のメソッドからクラスを構築するのは悪夢です。

やりたいことを何でもするための別のアプローチを見つけることを強くお勧めします。

于 2012-01-29T16:56:24.637 に答える
1

質問は古くて答えられていますが、コンパイル時に既知のセレクター/メソッドの呼び出しインスタンスを作成するための簡単で非常に洗練された方法を提供するリンクは次のとおりです。

http://www.cocoawithlove.com/2008/03/construct-nsinvocation-for-any-message.html

于 2015-04-21T19:25:24.213 に答える