9

그것은이 완료 핸들러와 함께 몇 가지 물건을 할 수 있도록하고 핸들러에서 그것을 풀어 개체를 할당 내 코드의 일반적인 패턴입니다 : 이것은 매우 잘 작동ARC에서 블록 완료 핸들러로 객체를 해제하려면 어떻게해야합니까?

LongOperation *foo = [[LongOperation alloc] init]; 
[foo runWithCompletion:^{ 
    // run some code and then: 
    [foo autorelease]; 
}]; 

,하지만 난 코드를 변환 할 때 ARC에서 Xcode는 블록에서 autorelease을 단순히 삭제할 수 없다는 불만을 제기합니다. 이는 foo 개체가 범위를 벗어나면 할당이 해제되도록하기 때문입니다.

그래서 ARC에서 이런 종류의 패턴을 작성하는 좋은 방법은 무엇입니까?

[self setFoo:[[LongOperation alloc] init]]; 
[foo runWithCompletion:^{ 
    // run some code and then: 
    [self setFoo:nil]; 
}]; 

을 ...하지만 코드는 재입되지 않을 것 이상 : 나는 foo의 인스턴스 변수를 도입 할 수있다.

답변

4

대부분의 경우 작동합니다 (즉, foo의 자체 내부를 참조하면 foo는 사라지기 전에 해당 코드를 충족시킬 수있을만큼 오래 지속됩니다). 약한 참조와 멀리 가야하지만 핸들러가 실행 된 후까지, 당신은 같은 것을 할 수있는 안처럼 같은 그 foo에 보이는 문제가있는 경우 :

__block LongOperation* foo = [[LongOperation alloc] init]; 
[foo runWithCompletion:^{ 
    // do some things 
    foo = nil; 
}]; 

참고이이 패턴의 반대의 종류 이로 인해 관리되는 메모리 규칙에 따라 객체/not /가 캡처됩니다.

+0

이것은 foo가 포함 된 컨텍스트가 오래 전에 사라 졌을 때 어떻게해야하는지에 대한 질문에 대답하지 않습니다. 이 솔루션을 사용하면 [foo runWithCompletion :]을 호출하는 스택 프레임은 실행이 완료되거나 스택이 더 위험해질 때까지 차단해야합니다. –

관련 문제