GCD
의 블록에 있었을 때 항상 __weak
에 대한 참조는 self
이었습니다. 누구나 추천합니다. GCD에서 self
(테스트 됨)에 대한 강력한 참조가 유지 사이클을 생성 할 수 없다는 것을 알고 있습니다. 애플 블록이 실행되면 self
nil
가 없을 것을 보장하기 위해 자동으로 __weak
기준과 그 기준에 _week
__strong
기준을 사용하도록 권장.iOS - GCD에 대한 약하고 강력한 참조
- (IBAction)startGCD:(id)sender {
GCDVC* __weak weakSelf = self;
[self.activityIndicator startAnimating];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ // 1
// VC2* __strong strongSelf = weakSelf;
[weakSelf.proArray addObject:@"2"];
[NSThread sleepForTimeInterval:10];
NSLog(@"%@",weakSelf.proArray);
dispatch_async(dispatch_get_main_queue(), ^{ // 2
[weakSelf.activityIndicator stopAnimating];
});
});
}
테스트 1 I 버튼을 누르고 표시가 회전되어
나는 다음과 같은 코드 조각이있다. GCD가 끝나기 전에 뒤로 버튼을 누르고 GCDViewController가 해제됩니다.
테스트 2 그런 다음 자신에 대한 강력한 참조를 제거하고 동일한 절차를 실행합니다. GCDViewController는 블록이 작업을 마칠 때까지 해제되지 않습니다. 그러나 그 때 풀어 놓았다.
테스트 지금은 내가 2
그래서 자기가 전무되지 않습니다 있는지 확인하려면 테스트와 정확한 동작을 (__weak
또는 __strong
없이) 자체를 직접 참조하는 경우 3 블록이 실행될 때 self
에 대한 __weak
참조를 참조하는 __strong
참조를 사용하는 지점이 무엇입니까? 내가 여기 뭔가보고 싶니? 테스트 2 & 3의 결과를 변경하는 예제가 있습니까?
당신은 블록이 실행되는 동안 자기가 해제됩니다 어떤 시나리오를 방지하기 위해 블록 내부의 강한 참조를 만듭니다. – dan
예 알아요. 그러나 __strong과 self의 차이점은 무엇입니까? 내가 직접 자기 자신을 호출하면 나는 __strong과 같이 셀 수를 늘린다. 그리고 출력은 두 경우 모두 같습니다. – BlackM
블록에서 직접 self를 참조하면 블록이 주변에있는 동안 자체가 할당 해제되지 않습니다. 블록 외부에 약한 자기를 생성 한 다음 내부가 강한 자체를 생성하면 블록이 주변에있는 동안 자체를 할당 취소 할 수 있으며 블록이 실행되는 동안 만 자체를 차단합니다. – dan