3

通常の NSError** 引数を持つメソッドのセレクターを呼び出したい:

-(int) getItemsSince:(NSDate *)when dataSelector:(SEL)getDataSelector error:(NSError**)outError  {
    NSArray *data = nil;
    if([service respondsToSelector:getDataSelector]) {
        data = [service performSelector:getDataSelector withObject:when withObject:outError];
        // etc.

...コンパイラが気に入らないもの:

warning: passing argument 3 of 'performSelector:withObject:withObject:' from incompatible pointer type

ポインターをオブジェクトにカプセル化することを回避する方法はありますか?

4

3 に答える 3

14

より柔軟な方法で「Selector」を実行できるNSInvocationを確認してください。

開始するためのコードを次に示します。

if ([service respondsToSelector:getDataSelector]) {
    NSArray *data;
    NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:
        [service methodSignatureForSelector:getDataSelector]];
    [invocation setTarget:delegate];
    [invocation setSelector:getDataSelector];
    // Note: Indexes 0 and 1 correspond to the implicit arguments self and _cmd, 
    // which are set using setTarget and setSelector.
    [invocation setArgument:when atIndex:2]; 
    [invocation setArgument:outError atIndex:3];
    [invocation invoke];
    [invocation getReturnValue:&data];
}
于 2009-05-20T20:30:32.800 に答える
3

NSError** はオブジェクト (id) ではありません。NSInvocation に移動することもできますが、これが使用したいメッセージが 1 つだけの場合、それは大変な作業のように思えます。オブジェクトにラップされた NSError** を引数として受け取る中間セレクター メソッドを定義してみて、そのメソッドに performSelector を実行させます (これはおそらく、質問の最後で意味したことだと思いますか?)

于 2009-05-20T20:29:23.037 に答える
2

私は肯定的ではありませんが、 のNSInvocation代わりにを使用することを検討することをお勧めします-performSelector:withObject:withObjectNSInvocationtype の引数を取るためvoid*、引数として必要なものを何でも設定できるようにする必要があります。

単純な呼び出しよりも数行多くのコードが必要にperformSelector:なりますが、ポインターをオブジェクトでラップするよりもおそらく便利です。

于 2009-05-20T20:22:20.787 に答える