0

중첩 된 블록의 __block 변수에 문제가 있습니다. 내 질문은, 다음과 같은 코드가 작동해야합니까?__block 변수 중첩 된 블록의 동작

__block NSString* s = nil; 
[self methodWithBlock:^ 
{ 
    s = [self methodThatReturnsAnAutoreleasedString]; 
    [self methodWithBlock:^ 
    { 
     [NSLog @"%d", s.length]; 
    }]; 
}]; 

내부 블록이 s으로 유지되지만 내 코드에는 해당되지 않는다고 가정했습니다. 내부 블록의 s에 액세스 할 때 "할당 해제 된 인스턴스로 전송 된 메시지"가이됩니다. 내가 그것을 할당 할 때 (s = [[self methodThatReturnsAnAutoreleasedString] retain];)를 유지하면 정상적으로 작동합니다.

물론 실제 코드가 아니기 때문에 더 복잡합니다.하지만 최소한의 예제 만 제대로 작동하는지 알고 싶습니다. 그렇다면 다른 곳에서 나의 문제를 찾아야합니다. Transitioning to ARC Release Notes에서

+0

"내가 (...) 할당 할 때 보유하면 잘 동작합니다." 네, 그렇게해야합니다. 또한 작업을 마쳤을 때 놓지 않으면 유출됩니다. – newacct

답변

3

(난 당신이 ARC를 사용하지 않는 것으로 가정합니다.) : 수동 참조 카운팅 모드에서

, __block id x;x을 유지하지 의 효과가 있습니다.

가정이 틀리면 블록에 s이 보관되지 않습니다. methodWithBlock이 비동기 적으로 작동하는 경우이 값을 유지해야합니다.

+0

아, ARC와 수동 참조 카운팅에서 __block이 다르게 작동하는 것을 알지 못했습니다. 감사! –

+0

@MarianoRuggiero : 천만에요. - 예, 이것은 미묘한 차이입니다. 다행히 모든 프로젝트에서 ARC를 사용할 수 있습니다 :-) –

+0

@MarianoRuggiero : 예, MRC에서는 블록에 캡처 된 변수를 보관하지 못하게하는 유일한 방법은'__block '을 사용하는 것입니다. ARC에서는 대신에'__weak' 또는'__unsafe_unretained'를 사용합니다. – newacct