2011-11-05 8 views
3

私は、objective-cメソッドは実際にはc関数であり、最初の2つの引数はselfと_cmdであることを知っています。私は、例えば、(含むまたは除く、自己および_cmd)配列として残りの引数を取得するためにobjective-cメソッドの引数をインデックスで取得する

をしようとしている:

[self doOtherMethod:@selector(otherMethod:withObject:andObject:) withObjects:args]; 

-(void)someMethod:(id)firstArg withObject:(id)secondArg andObject:(id)thirdArg { 
    //then something like: 
    args[0] //corresponds to self 
    args[1] //corresponds to _cmd 
    args[2] //corresponds to firstArg 
    args[3] //corresponds to secondArg 
    args[3] //corresponds to thirdArg 
    //or just start from firstArg being the 0th item in the index (skipping out self and _cmd) 
} 

を私は何をしようとしているようなものです

どのように私はそれらを渡すか、それらを列挙できるように、メソッドに渡される引数の配列(c配列またはNSArray)を取得できますか?

編集:私は既存の方法でこれをやりたいです。私が変更できないデリゲートメソッド。

+0

たぶん、あなたはにObjCブロックでそれを行うことができますが。 – 3lvis

+0

これは実際には非常に困難な問題です。 –

+0

@DaveDeLong、もしあなたが私のためにそれが不可能ではないと言っているのなら、 –

答えて

1

引数渡しのメカニズムはアーキテクチャに依存し、レジスタ、スタック、またはその両方に値を渡すことがあります。デバッグ以外の目的で引数のリストを動的に見つけようとするのは良い考えではありません。

ここで私は、引数の渡し方にもっと洞察を得るための素晴らしい出発点だと思うの記事です:http://en.wikipedia.org/wiki/Calling_convention

0

これらのargsのNSArrayを取り込む関数を作成してみてください。あなたは自分や_cmdを渡すことなくそれを行うことができます。

- (void)serverRespondedWithJSONObjects:(NSArray *)objects { 
    NSMutableArray *objects = [NSMutableArray array]; 
    for (NSDictionary *dictonary in objects) { 
    SomeObject *object = [[[SomeObject alloc] init] autorelease]; 
    object.name = [dictionary valueForKey:@"name"]; 
    [objects addObject:object]; 
    } 
    [self doSomethingWithArgs:objects]; 
} 

- (void)doSomethingWithArgs:(NSArray *)args { 

    for (SomeClass *someObject in args) { 
    //do something interesting with someObject. 
    } 

} 
+1

申し訳ありませんが、私は既存のメソッドでこれを行いたいのですが、新しいメソッドを作成しません。 –

4

NSInvocationを使用します。ほぼ任意の引数セット、セレクタとターゲットをカプセル化し、後で直接的に呼び出すことができます。

また、ブロックを使用してください。コールをブロックの中にカプセル化し、必要な状態をキャプチャしながら残りを引数として渡すことができます。

あなたがしようとしていることは、一般的にデザイン/アーキテクチャの問題を示しています。これを行う必要はありません。

しかし、何らかの理由で契約が成立していることは確かです。契約によってひどいコーディングの必要性がどのように決定されるかを正確に知ることができます。


が、それはまた、現在のメソッドの引数にアクセスすることができますか?

「並べ替え」

あなたが尋ねていることは明確ではありません。 「現在の方法」があなたが実装したものでない場合は、あなたができることはほとんどありません(すばらしいスウィズルや他のランタイム・ゲームが本当に決して使用されるべきではありません)。

実装している場合は、引数だけを使用します。遅延実行(またはブロック)したい場合は、NSInvocationでそれらをエンコードすることができます。

NSInvocationは、特定のケースで引数を取得するために使用されます。メソッド転送を実装するときは、特に。しかし、それはあなたがしようとしているものとは無関係のようです。

+2

NSInvocationを使ってメッセージを送信する(/メソッドを呼び出す)ことは知っていますが、現在のメソッドの引数にもアクセスできますか? –

関連する問題