ARC

2012-06-30 5 views
0

내가 NSTimer scheduledTimerWithTimeInterval에 대한 간접 포인터를 전달하기 위해 노력하고있어 함께 NSTimer scheduledTimerWithTimeInterval 포인터 - 투 - 포인터를 전달하는 방법은 다음과 같습니다 :ARC

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

이 '아무튼 대상 : 선택 : 사용자 정보 : 반복 Objective-C 포인터에 대한 간접 포인터의 'id'로의 암시 적 변환 오류를 제공하는 (Result * __strong *)에서 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 { ... }