위임에 약한 포인터를 사용하는 이유는 무엇입니까?
약한 포인터로 대리자를 정의하는 것이 올바른 이유를 이해할 수 없습니다.
@property (nonatomic,weak) id delegate;
델리게이트에 대한 참조를 유지할 필요가없는 이유를 알 수 없습니다. 델리게이트로 사용하는 객체가 할당 해제되는 것을 원하지 않습니다. 따라서 강력한 참조를 사용하는 것이 좋습니다. 약한!
대부분의 경우 델리게이트는 내 클래스의 인스턴스가 생성 될 동일한 객체입니다.이 경우 약한 참조를 생성하는 것은 유지주기를 피하는 훌륭한 솔루션이 될 것입니다 ...하지만 델리게이트로 완전히 다른 객체를 선택하면 어떨까요? ?
스택 오버플로에 대한 다른 질문을 검색했지만이 상황을 완전히 이해하는 데 도움이되는 것을 찾을 수 없습니다.
개체가 대리자를 약하게 유지하는 이유는 유지주기를 피하기 위해서입니다. 다음과 같은 시나리오를 상상해보십시오. 객체 a
가 b
이를 생성 하고 유지 한 다음 자신을 b
의 대리인 으로 설정합니다 . a
소유자가 해제하고 a
및을 포함하는 유지주기를 남깁니다 b
. 이것은 실제로 매우 일반적인 시나리오입니다. 뷰를 소유하고 해당 뷰의 델리게이트 역할을하는 뷰 컨트롤러를 생각해보십시오. 이 경우 뷰는 컨트롤러를 적절한 MVC 아키텍처의 재료로 유지하고 유지주기를 방지해야합니다.
유지주기가 유효한 문제이지만 약한 참조에 대한 추론은 여기에 설명 된 uikit 및 기타 요소와 함께 위임 패턴을 사용하는 방법에 대한 Apple의 관점과 더 관련이 있습니다.
특히 "위임의 주요 가치는 하나의 중앙 개체에서 여러 개체의 동작을 쉽게 사용자 지정할 수 있다는 것입니다."
대리자가 여러 개체의 위임 된 작업을 관리하는 경우 해당 개체는 대리자를 유지할 필요가 없으며 다른 개체에서 사용할 수 있으므로 대리자를 할당 해제하는 책임을 져서는 안됩니다. 약한 참조는 위임자의 관리가 위임자의 책임이 아니라는 개념을 적용합니다.
목표 c의 예는 테이블보기 및 uisearchbar와 함께 searchdisplaycontroller를 사용할 때와 같이 여러 테이블보기에 사용되는 하나의 대리자입니다. Apple의 예제에서는 컨트롤러를 대리자로 사용하지만 검색을위한 기본 테이블보기와 결과 테이블보기 모두에 대해 하나의 사용자 지정 대리자를 사용할 때 추론이 여전히 유지됩니다. 해당 사용자 지정 대리자는 두 테이블보기에 제공하기 위해 컨트롤러에 의해 유지 될 수 있습니다.
이는 위임자가 종종 위임자가 만들고 각 인스턴스가 자체 위임 인스턴스를 관리 할 수있는 다른 언어에서 참조되는 기본 위임 패턴과 근본적으로 다릅니다.
이것은 유지주기를 피하기위한 것입니다. Apple은 상황과 최선의 대처 방법을 설명하는 고급 메모리 관리 에 대한 유익한 가이드를 제공 합니다. ARC에서는 이제 강력한 참조 주기로 알려져 있으며 ARC 릴리스 노트로 전환에 설명되어 있습니다.
이전에는 다음과 같은 대리자에 대한 속성을 정의했습니다.
@property (nonatomic, assign) id delegate;
하지만 ARC에서는 이렇게 정의 할 수 있습니다.
@property (nonatomic, unsafe_unretained) id delegate;
또는 예를 들어라는 프로토콜이있는 경우 <MyObjectDelegate>
이러한 방식으로 대리자를 정의 할 수도 있습니다.
@property (nonatomic, weak) id <MyObjectDelegate> delegate;
즉, ARC에서 프로토콜이있는 경우 델리게이트를 선언 할 수 있습니다 weak
. 그렇지 않으면 unsafe_unretained
.
일반적으로 서로 참조를 보유하는 두 개체가있는 경우 "부모-자식"관계의 "자식"개체를 약한 참조로 만듭니다.
iOS의 위임 패턴의 경우 위임 된 객체없이 위임 호출자가 존재할 필요가 없기 때문에 위임 된 객체가 부모입니다. 예를 들어, sentenceShouldEnd 메서드에 대한 대리자 개체가있는 문장 개체가 있습니다. 단락 개체는 문장 개체의 위임 된 개체입니다. 분명히 단락 개체는 실제로 부모이며, 문장 개체에서 위임을 약한 참조로 유지해야합니다.
당신이 대리인을 자신에게 할당하는 것은 당신의 이해가 잘못되었습니다. 대리인을 자신에게 할당해서는 안됩니다. 티켓을 구매하기 위해 대리인을 고용해야한다고 생각한다면 왜 직접 티켓을 구매합니까? 당신은 완전히 다른 두 가지 개념을 말하고 있습니다. 델리게이트 객체를 속성으로 정의 할 때, 정의 된 객체에서 약한 참조가 사용됩니다 (즉, 델리게이트 객체는 A의 속성입니다). 델리게이트는 A를 초기화 할 때 할당됩니다 (B라고 가정 해 보겠습니다). 그러면 A.delegate를 self에게 할당 할 가능성이 가장 높습니다. 이것은 행위 적으로 B입니다. 여기에 부모-자식 관계가 보이십니까 ?? B에서 A에 대한 메모리를 할당합니다. B에서 A를 보유합니다. A는 B 없이는 존재하지 않습니다. 대리인을 A에 할당하지 않습니다 !!!!
참고 URL : https://stackoverflow.com/questions/8449040/why-use-weak-pointer-for-delegation
'program story' 카테고리의 다른 글
부동 소수점이 부정확하기 때문에 Unittest (때때로)가 실패합니다. (0) | 2020.12.08 |
---|---|
파이썬에서 재귀 적으로 디렉토리를 복사하고 모두 덮어 쓰는 방법? (0) | 2020.12.08 |
Javascript 파일에서 MVC ViewBag 객체에 액세스 할 수 있습니까? (0) | 2020.12.07 |
기존 인증서 (abc.crt) 및 abc.key 파일에서 키 저장소를 생성하려면 어떻게해야합니까? (0) | 2020.12.07 |
디버깅 할 때 COM 구성 요소 VS2012 호출에서 오류 HRESULT E_FAIL이 반환되었습니다. (0) | 2020.12.07 |