我正在尝试传递一个间接指针,指向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的转换,它给出了“将指向Objective-C指针的间接指针隐式转换为'id'”错误。
桥接演员表的变体和组合,例如(__bridge id)resultPtr
,使用objc_unretainedPointer(resultPtr)
或将指针类型更改为(Result * __weak *)
都没有帮助。这样做的正确方法是什么?
我想我可以创建一个包装类来保存我的间接指针并发送一个实例,但这看起来很难看。有没有更好的方法呢?
答案 0 :(得分: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 { ... }