2012-06-30 4 views
0

Я пытаюсь передать косвенный указатель на NSTimer scheduledTimerWithTimeInterval: цели: селектор: USERINFO: повторы: следующим образом:Как передать указатель на указатель на NSTimer scheduledTimerWithTimeInterval с ARC

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

Это Безразлично» t из-за приведения из (Результат * __strong *) в id, что дает «Неявное преобразование косвенного указателя на указатель Objective-C на ошибку« id ».

Вариации и комбинации мостовых отливок, таких как (__bridge id)resultPtr, с использованием objc_unretainedPointer(resultPtr), или изменение типа указателя на (Result * __weak *) не помогли. Каков правильный способ сделать это?

Я полагаю, что я мог бы создать класс-оболочку, содержащий мой косвенный указатель, и отправить экземпляр этого, но это кажется уродливым. Есть ли лучший способ сделать это?

ответ

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 { ... } 
Смежные вопросы