2

を使用せずにOK NSInvocation、次のコードがあるとしましょう:

...
array = [NSMutableArray arrayWithObjects:@"Yoda", @"Jedi", @"Darth Vader", @"Darth Vader", @"Darth Vader" , @"Darth Vader", nil];

SEL removeObjectMessage = @selector(removeObject:inRange:);

//does array allow us to remove and object in a range? if so let's do this    
if ([array respondsToSelector:removeObjectMessage]){   
    NSRange darthVaderRange=NSMakeRange(2, 3);
    [array removeObject:@"Darth Vader"inRange:darthVaderRange];
}

SEL removeObjectMessage の形式で最後の行を実行するにはどうすればよいですか? 範囲の周りにラッパーを配置する必要がありますか?その混乱がどのように見えるかの構文を見たいだけです...

4

3 に答える 3

2

あなたがすることができます:

if ([array respondsToSelector:removeObjectMessage]){   
    NSRange darthVaderRange=NSMakeRange(2, 3);
    objc_msgSend(array, removeObjectMessage, @"Darth Vader", darthVaderRange);
}

それはかなり壊れやすいように見えますが...

于 2011-06-27T19:16:14.570 に答える
1

セレクターと非オブジェクト引数を渡して有効なメソッド呼び出しを取得できる既存のメソッドはありません。オブジェクト引数のみをとるメソッドの場合は、[array performSelector:removeObjectMessage withObject:@"Darth Vader" withObject:someHypotheticalRangeObject]を実行します。

ただし、NSRangeでこれを行うには、NSInvocation(実行したくないと言った)を使用するか、NSObjectでカテゴリを作成し、低レベルのObjective-Cランタイム関数を使用してメソッドを定義する必要があります。これは、セレクター、オブジェクト引数、および非オブジェクト引数を取り、適切なメソッドを呼び出します。

于 2011-06-27T18:44:17.913 に答える
1

残念ながら、型idではない引数を渡す場合は、オブジェクトを使用する必要がありNSInvocationます。(それ以外の場合は、を使用できますperformSelector:withObject:withObject:。)

于 2011-06-27T18:41:56.217 に答える