를 사용하여 당신은 질문 :
이 메인 큐 블록 내에서 sself
에 액세스 할 수있는 적절한 방법이 있나요?
거의. sself
이 nil
이 아닌지 확인해야합니다. nil
포인터가있는 역 참조를 사용하면 앱이 다운 될 수 있기 때문에이 작업을 수행 할 수 있습니다.
- (void) doSomething
{
typeof(self) __weak wself = self;
dispatch_async(dispatch_get_global_queue(0,0), ^{
typeof(self) sself = wself;
if (sself) {
[sself->dataArray addObject: @"Hello World"];
dispatch_async(dispatch_get_main_queue(), ^{
[NSThread sleepForTimeInterval: 30];
UIAlertView *alert = [[UIAlertView alloc] initWithTitle: sself->dataArray[0]
message: @"Message"
delegate: nil
cancelButtonTitle: @"OK"
otherButtonTitles: nil];
[alert show];
});
}
});
}
그런 다음 질문 :
이
sself
초기 큐가 완료되면 범위를 벗어나 가시겠습니까 따라서, 반드시 그렇지 nil
의 확인하십시오?
범위를 벗어나지 만 내부 블록이 보유하고 내부 블록이 완료 될 때까지 유지됩니다.
메인 대기열 블록에 __typeof__(self) sself = wself;
을 추가해야합니까?
원할 수도 있지만 필수는 아닙니다. 원하는 동작에 따라 다릅니다. 예를 들어 현재 객체 (보기 컨트롤러 일 가능성 있음)가 해제 된 경우에도이 경고를보고 싶다면 sself
패턴을 사용하십시오 (아마 dataArray
에 액세스 할 수 있도록 잠시 멈춤을 원하기 때문일 수 있습니다). 경고를 더 이상 표시하고 싶지 않으면이/strongSelf
춤을 반복하십시오.
출처
2014-02-05 14:17:56
Rob
덧붙여서,이 특별한 예에서는 원하지 않는 경우이'weakSelf' /'strongSelf' 패턴을 사용하지 않아도됩니다. 이 작업을 실제로하고 싶은 곳은 강력한 참조주기가있는 곳입니다. 그러나 귀하의 다른 질문과는 달리 잠재적 인 강력한 참조주기는 없습니다.이 함수는 (sleepForTimeInterval에 의해 표현 된 코드가 실행되는 동안 객체가 실제로 유지되는 것에 대해 정말로 염려한다면) 앱에 대해 이해가된다면 분명히 'weakSelf' /'strongSelf' 댄스를 수행 할 수 있습니다.하지만 주목할 가치가 있습니다 당신은이 경우에는 필요가 없습니다. – Rob