2011-12-13 1 views
0

나는 ARC와 호환되도록 다음과 같은 코드를 변경할 수있는 방법 : 지금ObjC : 오브젝티브 C 포인터 간접 포인터의 캐스트

MyObj* fn = nil; 
[self performSelectorOnMainThread:@selector(popSomething:) withObject:(id)&fn waitUntilDone:YES]; 

, 나는 다음과 같은 오류 얻을 :

error: cast of an indirect pointer to an Objective-C pointer to '__strong id' is disallowed with ARC [4]

+0

YES ]; 대신'? –

+0

@AndreyZ : 그렇기 때문에이 호출이 반환 된 후에'fn'은 여전히'nil'입니다. – Albert

+0

@Albert : fn이'nil'으로 시작했기 때문입니다. – MusiGenesis

답변

0

인수 유형은 (id *)이어야합니다. 객체가 아니라 객체를 가리키는 포인터. 이것은의 방법 -popFilename을 실행

__block id poppedFilename; 
dispatch_sync(dispatch_get_main_queue(), ^{ 
    poppedFilename = [self popFilename]; 
}); 
// do something with the popped file 

: 당신은 당신이 주 스레드에서 실행해야하는 방법에서 값을 반환 할 경우

는하지만, 더 좋은 솔루션은 블록과 GCD를 사용하는 것입니다 결과를 poppedFilename에 저장합니다. 교착 상태가 발생할 수 있으므로 주 스레드에서이 메서드를 호출하지 않도록주의해야합니다. 메인 스레드에있는 경우에 당신이 확실하지 않은 경우, 다음과 같이 사용할 수 있습니다 : @selector (queuedFileNamesPop : withObject : FN waitUntilDone : 당신이`[자기 performSelectorOnMainThread을 사용할 수없는 이유

__block id poppedFilename; 
if ([NSThread isMainThread]) { 
    poppedFilename = [self popFilename]; 
} else { 
    dispatch_sync(dispatch_get_main_queue(), ^{ 
     poppedFilename = [self popFilename]; 
    }); 
} 
2

당신은 다음 문자열이 변경 가능한 문자열을 사용하고 단순히 메인 스레드에 전달하는 것입니다 할 수있는 더 좋은 방법으로 업데이트 할 메인 스레드를 기대하는 경우 :

그러면 주 스레드가 단순히 문자열을 업데이트 할 수 있습니다.

+0

그게 왜 더 좋은 방법일까요? 어떻게 든 호출 된 함수 ('queuedFileNamesPop')에서 호출 수신자에게 객체를 전달할 수있는 방법이 없습니까? 이 솔루션은 이제'NSString'의 경우에 작동합니다. 변경 가능한 클래스가없는 곳에 다른 객체를 전달하려면 어떻게해야합니까? – Albert

+0

performSelectorOnMainThread는 객체를 반환하는 옵션을 제공하지 않으므로 반환 값을 넣을 장소를 전달해야합니다. 또 다른 옵션은 NSMutableArray를 전달하고 호출 수신자가 원하는 모든 것을 배열에 넣는 것입니다. – stevex

+0

예, NSMutableArray를 사용하는 것과 같은 것에 대해 생각했습니다. 그러나 나는 확신 할 수 없었다, 그것은 나를 위해 해킹과 너무 많이 보였다. 이것이 일반적인 방법입니까? – Albert