NSZombie는 무엇입니까?


답변:


191

메모리 디버깅 보조 도구입니다. 특히, NSZombieEnabled객체가 할당 해제되지 않고 0에 도달 할 때마다 NSZombie인스턴스 로 모핑됩니다 . 그러한 좀비가 메시지를받을 때마다 충돌하거나 예측할 수없는 방식으로 행동하는 대신 경고를 기록합니다. 따라서 고급 도구 나 건초 더미 검색에서 힘든 바늘없이 미묘한 과다 릴리스 / 자동 릴리스 문제를 디버깅 할 수 있습니다.

이름은 개체가 0에 도달 할 때 일반적으로 "죽은"것으로 간주된다는 사실에 대한 상당히 명백한 놀이입니다.이 설정을 사용하면 개체는 살아 있거나 죽지 않은 이상한 반감기에 계속 존재합니다. 실제 좀비와 비슷하지만 뇌를 덜 먹습니다.


61
기본적으로 모든 개체가 누출되므로 디버깅이 완료되면이 설정을 제거해야합니다.
Justin

1
이 간단한 설명에 감사드립니다. Cocoa Dev Link가 더 이상 작동하지 않는다고 알려주십시오. 짧고 요점에 +1.
CRDave 2014

95

Adam은 좀비가 무엇인지 잘 설명했지만 환경 변수를 사용하는 것이이를 찾고 추적하는 가장 좋은 방법은 아닙니다.

좀비 탐지에 대한 훨씬 더 나은 접근 방식은 Instruments를 사용하는 것입니다. XCode에서 "Run with Instrument"로 시작하고 "Allocations"를 선택합니다.

그런 다음 녹화가 시작된 직후에 중지하고 Allocations 기기에서 "i"버튼을 누르고 "enable reference counts"및 "Enable NSZombie Detection"을 켭니다. 이제 악기에서 녹음을 다시 누르면 앱이 시작됩니다. 좀비 개체가 전송되면 메시지 녹음이 중지되고 녹음 타임 라인에 대화 상자가 나타납니다.이를 클릭하여 개체가 있던 모든 장소를 찾을 수 있습니다. 유지 또는 해제됩니다.

편집 : 이전 조언은 XCode 3에 대한 것이었고 여기에 XCode 4에 대한 추가 사항이 있습니다.

XCode 4.2 에는 Zombie Detection을 사용하는 더 쉬운 메커니즘 인 Zombie Instrument가 있습니다. 앱을 시작하기 위해 "실행"대신 "프로필"을 사용하면 악기 선택기가 나타납니다. "Zombie"를 선택하면 앱이 실행되기 시작합니다. 크래시를 유발하는 모든 작업을 수행하면 "Zombie Messaged"라는 대화 상자가 나타납니다.

여기에서 대화 상자의 작은 화살표를 클릭합니다. 그러면 좀비 개체가 생성, 유지 또는 해제 된 모든 시간의 목록이 표시됩니다. 사이드 바를 위로 당기면 각 항목으로 이동하여 보유 수의 각 조정을 담당 한 코드에 대한 스택 추적을 볼 수 있습니다.


2
이것은 매우 유용한 조언입니다.
w.donahue

4
XCode 4에 대한 답변을 업데이트하여 Instruments에서 좀비 감지를 훨씬 쉽게 수행 할 수 있습니다.
Kendall Helmstetter Gelner

실제로는 XCode 5 및 6에서 거의 동일하게 작동해야합니다.
Kendall Helmstetter Gelner 2014

2
또한 XCode 7.2
이길

31

Kendall이 추가 한 내용에 동의합니다. 매우 유용하지만 여전히 환경 변수를 사용하여 활성화 된 것을 잊지 않도록 권장합니다. Cocoa Dev의 (현재 만료 된) 링크와 유사하게, 저는 이것을 놓치기 때문에 놓치지 않습니다.

if(getenv("NSZombieEnabled") || getenv("NSAutoreleaseFreedObjectCheckEnabled")) {
    NSLog(@"ZOMBIES/AFOC ARE ENABLED!!! AAAAARRRRRRGH!!! BRAINS!!!");
} 

그것은 내 관심을 아주 잘 잡습니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.