0

我正在尝试将间接指针传递给 NSTimer scheduleTimerWithTimeInterval: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 的强制转换,这不起作用,这给出了“间接指针到 Objective-C 指针到 'id' 的隐式转换”错误。

桥接强制转换的变体和组合,例如(__bridge id)resultPtr、 usingobjc_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 回答