Objective-C에서 self이 안전하지 않은 경우, 약한 객체에서 메소드를 호출하거나 속성에 액세스 할 정당한 이유가 없다고 일반적으로 말할 수 있습니까? 즉. 이 작업을 수행하지 :이 doStuff가 호출 될 때까지 범위에 남아 보장 자체에 대한 또 다른 강한 참조는하지만, 이것은 매우 가난한 이유 인 경우약한 객체에 대한 메소드를 호출해야 할 충분한 이유가 있습니까?
__weak typeof(self) weakSelf = self;
dispatch_async(dispatch_get_main_queue(), ^{
[weakSelf doStuff];
});
물론, 기술적으로이 확인 될 수있다.
좋은 이유가 없다면 최소한 컴파일러 옵션 뒤에서 컴파일러가 이러한 호출을 거부하는 것이 좋습니다. document 당신이 참조에서
귀하의 질문에 대한 대답으로, 일반적인 'weakSelf'패턴을 사용하는 데는 여러 가지 중요한 이유가 있습니다. 실용적인 이유 때문에, 귀하의 예와 똑같이하는 것이 거의 없습니다. 컴파일러가이 패턴을 거부하기를 원하지 않는다는 것이 확실합니다. 우리는 이것을 정확히하고 싶은 시나리오를 쉽게 만들 수 있습니다. 예를 들어, 이것이 뷰 컨트롤러의 네트워크 요청 완료 핸들러에 있고 모델 객체 업데이트를 마친 후 doStuff가 UI를 업데이트했다면 어떻게 될까요? 당신은 당신이 여기있는 것과 매우 흡사하게 행동 할 것입니다. – Rob
그건 오타 였어. 나는 안전하지 않은 것을 의미했다. 네트워크 요청을 위해 [weakSelf doStuff]를 호출 할 필요는 없습니다. 당신은 항상 typeof (self) strongSelf = weakSelf를 할 수 있습니다; [strongSelf doStuff]; 분명히 약한 객체의 경우 doStuff 동안 객체가 근본적으로 강해지므로 strongSelf를 추가하면이 경우 중복 될 수 있습니다. –
"강한"과 "약한"에서 "좋은"과 "가난한"의 이유를 설명하는 형용사가 변경되어 clang 메모리 관리 용어와 혼동을 일으키지 않도록했습니다.또한 할당 후 즉시 해제되기 때문에 진정한 __weak * 참조는 무의미하다고 생각하십시오. – danh