두 정의가 동일하지 않습니다.
절대적으로하지. 당신이 지적한 두 정의의 주요 차이점은 "다른 사람만큼 오래"입니다. 중요한 것은 "다른 사람"입니다.
다음을 고려하세요:
__strong id strongObject = <some_object>;
__weak id weakObject = strongObject;
이제 우리는 <some_object>
강한 것과 약한 것에 대한 두 개의 포인터를 얻었습니다 . 이렇게 설정 strongObject
하면 nil
:
strongObject = nil;
그런 다음 요약 한 규칙을 살펴보면 다음과 같은 질문을 할 것입니다.
강력 함 : "더 이상 가리 키지 않을 때까지 힙에 보관"
strongObject
<some_object>
더 이상 가리 키지 않습니다 . 그래서 우리는 그것을 유지할 필요가 없습니다.
약함 : "다른 사람이 강력하게 지적하는 한 유지"
weakObject
여전히을 가리 킵니다 <some_object>
. 그러나 아무도 이후 다른 그것에 점,이 규칙은 우리가 그것을 보관할 필요가없는 것을 의미한다.
그 결과 <some_object>
할당이 취소되고 런타임에서 지원하는 경우 (Lion 및 iOS 5 이상) weakObject
자동으로로 설정됩니다 nil
.
이제 우리는 설정하면 어떻게됩니까 고려 weakObject
하기 nil
때문에 좋아한다 :
weakObject = nil;
그런 다음 요약 한 규칙을 살펴보면 다음과 같은 질문을 할 것입니다.
강력 함 : "더 이상 가리 키지 않을 때까지 힙에 보관"
strongObject
을 가리 킵니다 <some_object>
. 그래서 우리는 그것을 유지해야합니다.
약함 : "다른 사람이 강력하게 지적하는 한 유지"
weakObject
가리 키지 않습니다 <some_object>
.
그 결과, 즉 <some_object>
되어 있지 해제하지만, weakObject
될 것 nil
포인터.
[가정하는 모든 것은 <some_object>
다른 곳의 강력한 참조 / "보유"되는 다른 수단에 의해 지적되지 않습니다.]