2011-02-07 1 views
1

을 overreleasing에도 불구하고 1 이하로 결코 유지 내가 할 수있는 가장 낮은 값이 경우에도 "R = 1"인 것으로 보인다 I 의도적으로 추가 "릴리스"를 추가하는 "R = 1"한계는 내가 객체의 dealloc 방법에서 "해제"와 "NSLog"테스트 코드를 넣어하려고하는 경우에도 보유객체 '카운트 일부러 내가 일부 개체의 보유 수에 확인하고

[aObject release]; 

호출합니다.

코코아 실행 시간은 GC없이 샘플 프로그램의 끝에 "EXC_BAD_ACCESS"로 충돌하기 전에 "r = 1"까지 내 추가 릴리스를 무시하는 것 같습니다.

내 유일한 설명 (추측)은 개체에 액세스하려면 r> = 1이 필요하다는 것입니다. 그리고 코코아 실행 시간은 객체의 보유 개수를 조기에 0으로 만드는 것을 삼가려고합니다.

내가 틀렸다면 누군가가 나를 확인하거나 수정할 수 있습니까?

+0

확인하시기 바랍니다 [서식 가이드] (http://stackoverflow.com/editing-help) 다음에 시간을 게시 할 때. –

답변

5

개체의 보유 수가 0에 가까워지면 (즉 보유 수는 1이고 다시 릴리스가 호출 된 경우) 최종 감소를 수행하는 대신 귀찮게됩니다.

+0

"r = 1"제한을 설명합니다. 그러나 멈추기 전에 "r"을 0 또는 음수 값까지 감소시킬 수 있다면 오류를 검사하는 것이 좋습니다. 이것들은 디버그 모드에서 이것을 구현할 수 있고 유용한 부가 기능이 될 수 있습니다 ... – Stanley

+0

흥미로운 이론이지만, 때때로 'retainCount'가 어떻게'-1'이 될지 설명하지 않습니다 :) –

+1

@Stanley : The 당신이 찾고있는 기능을 좀비 (Zombies) 라 부르며 포함되어 있습니다. 단순히 보유 카운트를 0으로 감소시키는 것은 무의미합니다. 왜냐하면 오브젝트에 그 보유 카운트를 요청하는 유효한 코드가 여전히 없기 때문입니다. – Chuck

0

참조를 카운트에 기초 메모리 관리의 철학은> = 1 번 참조하면서 객체가 존재한다는 것이다. retainCount는 = 0 이론적으로, 따라서 적어도 retainCount = 1

을 가지고, 개체가 존재하고 aObject에 의해 참조 유지, 당신은 여전히 ​​메시지를 전달할 수 있다면 때문에 [aObject retainCount] == 0;를 얻을 수 없습니다 그 이유는, 개체가 더 이상 참조되지 않는 것을 의미한다
+0

'죽은'객체에 대한 100 개의 참조를 저장할 수 있으며 메모리가 재사용되거나 응용 프로그램이 충돌하는 것을 막지는 않습니다. –

+0

@ 니키타 (Nikita) : 객체에 대한 많은 참조가 있고이 객체가 '사망'이라면 _memory management_ 규칙 중 하나를 위반 한 어딘가를 의미합니다. 이 개념이 작동하는 것을보고 싶다면 [this] (http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmRules.html#//apple_ref/)를 존중 해보십시오. doc/uid/20000994-BAJHFBGH) 규칙을 준수해야합니다. –

+0

@Martin 질문과 관련된 메모리 관리 지침은 어떻게됩니까? 당신은 방금 그 인스턴스를 참조하는'aObject' 변수가'retainCount'에 영향을 미치고 있다고 말했고 저는 그것이 부적당하다고 말하고 있습니다. –

3

retainCount가 == 0 인 경우 특이점을 얻었습니다!

치킨 만남. 아니면 달걀이 닭과 만나는가?

정의에 따라 나머지 하나의 보유가있는 개체를 해제하면 개체 할당이 취소되었음을 의미합니다. 이후의 모든 메소드 호출은 정의되지 않은 동작을 초래합니다.

1

계측기 도구는 좀비 탐지 기능을 제공하므로 코코아 참조 계산을 디버깅하는 것보다 효과적입니다. Xcode의 실행> 성능 도구로 실행> 좀비 명령을 사용하십시오. 그것은 당신이 출시 된 객체에서 메소드를 호출 할 때이를 탐지하고 객체의 전체 수명주기에 대한 보유/릴리즈 이력을 보여줍니다. 애플이이 도구를 추가 한 이후로 인생은 훨씬 좋아졌습니다.

0

개체 참조가 0이되면이 개체는 "좀비 개체"가되지만 메모리 관리에서 Xcode가 기본적으로 "좀비 개체 사용"을 설정하지 않았기 때문에 retainCount 메시지를 보낼 수 있습니다. 이는 Xcode에서 ' 좀비 개체를 확인하십시오.

"Edit Scheme-> Run-> Diagnostics-> Enable Zombie Objects"에서 "좀비 객체 사용"의 체크 표시로 좀비 객체를 검사하면 Xcode는 객체를 보낸 후 계속 메시지를 보내면 오류 메시지를 받게됩니다 참조 0

스냅 샷이 될 :

enter image description here