2011-09-05 5 views

답변

16

다음 답변은 가비지 수집이없는 경우 (예 : iOS)입니다. 가비지 수집의 경우 실제로 약한 참조를 생성하는 키워드 (__weak)가 있습니다.

"weak"참조는 보유하지 않은 참조입니다.

주기를 분해하려면이 약한 참조를 사용해야합니다. 일반적인 경우는 상위 객체에 대한 참조가 필요한 하위 객체입니다. 이 시나리오에서 부모는 자식 개체에 대한 참조를 유지하고 자식 개체는 부모에 대한 참조를 가지지 만이를 유지하지는 않습니다. 자식 개체는 부모 개체가있는 동안 만 존재해야하기 때문에이 방법이 효과적입니다.

약한 참조는 자동으로 재생 된 메시지에 의한 참조입니까?

정말 그는 "매우 약한 참조";-) 호출 스택이 풀어진 인 경우

자동 해제 물건 (예 : 모든 이벤트 루프의 끝에서) 멀리가는 것 없습니다. 덜 일시적인 것이 필요한 경우 참조를 유지해야합니다 (위의 경우와 같이 다른 일부가 충분히 유지해야 함).

+0

저는 주로 iOS SDK에 관심이 있습니다. iOS 4와 관련하여 모든 "할당 유형"속성을 수행하고 명시 적 유지 메시지가없는 다른 obj 포인터에 대한 다른 단순 할당은 약한 참조로 간주되어야합니까? – Centurion

+1

예. 그러나 "alloc"과 같은 메소드는 암시 적 "retain"을 포함합니다. – Thilo

+0

@Thillo 속성을 사용하는 경우'weak'는'assign'과 동일합니까? –

6

약한 참조는 강한 참조가 개체를 강제로 메모리에 남아있는 동안 개체가 메모리에 남아 있도록 강제적이지 않은 참조입니다.

변수에 약한 참조를 작성한 경우 해당 변수에 대해 nil을 얻을 수 있습니다.

UITableViewDelegate, UIScrollViewDelegate 등은 약한 참조의 예이다. 강한 참조

예 : 다음 obj1도 제거 얻을 메모리에서 obj2를 제거하면 obj1

MyClass *obj1 = [[Myclass alloc] init]; 

Myclass *obj2 = obj1; 

여기 obj2이 가지고 강한 참조는 것을 의미한다.

+1

obj2에는 obj1에 대한 강력한 참조가 실제로 있습니까? "약한 참조는 개체가 메모리에 남아 있도록 강제적이지 않은 참조입니다."라는 예를보고 obj1에 릴리스 메시지를 보내면 obj1이 메모리에 유지되지 않습니다. " Myclass * obj2 = obj1; " 할당은 obj1의 보유 수를 증가시키지 않습니다. IMHO 약한 참조입니다. – Centurion

+0

나에게 강한 참고 사항을 설명해 주시겠습니까 ?? – Hitesh

+0

제 생각에는 "[obj2 유지];" 그것을 강력한 참고 자료로 만들 것입니다. 예, obj2는 obj1에 대한 포인터이고 두 개의 유지 카운트는 메모리에 할당 된 동일한 객체에 속하며 IMHO는 어딘가에 한 곳에 저장됩니다.그러나 모든 +1 보유 수에는 소유자 (적어도 이론상)가 있으며 나에게 해당 소유자에 대해 명시 적 (보유) 또는 암시 적 (할당) 보존 메시지를 대상에 보내는 데 사용 된 var/ivar/속성으로 생각하는 것이 좋습니다. 목적. – Centurion