0

次のように、NSTimerのscheduledTimerWithTimeInterval:target:selector:userInfo:repeats:に間接ポインターを渡そうとしています。

-(void)assignResultAfterDelay:(Result **)resultPtr {
    [NSTimer scheduledTimerWithTimeInterval:1000 
                                    target:self
                                  selector:@(assignResult:)
                                  userInfo:resultPtr  // how to do this?
                                   repeats:NO];
 }

これは、(Result * __strong *)からidへのキャストのために機能しません。これにより、「IndirectポインターからObjective-Cポインターへの'id'への暗黙の変換」エラーが発生します。

(__bridge id)resultPtr、の使用objc_unretainedPointer(resultPtr)、またはポインタタイプの変更などのブリッジキャストのバリエーションと組み合わせは役に立ち(Result * __weak *)ませんでした。これを行う正しい方法は何ですか?

間接ポインタを保持するラッパークラスを作成してそのインスタンスを送信できると思いますが、それは醜いようです。それを行うためのより良い方法はありますか?

4

1 に答える 1

0

私はそれを理解したと思います。NSInvocation を使用すると、次のようにコンパイルできます。

-(void)assignResultAfterDelay:(Result * __strong *)resultPtr {
    NSMethodSignature *sig = [self methodSignatureForSelector:@selector(assignResult:)];
    NSInvocation *inv = [NSInvocation invocationWithMethodSignature:sig];
    [invocation setTarget:self];
    [invocation setSelector:@selector(assignResult:)];
    [invocation setArgument:resultPtr atIndex:0];

    [NSTimer scheduledTimerWithTimeInterval:1000 invocation:inv repeats:NO];
}

// where assign result looks like:
-(void)assignResult:(Result * __strong *)resultPtr { ... }
于 2012-06-30T15:21:16.313 に答える