Co to jest NSZombie?

97

Widziałem propozycje mówiące ustawić NSZombieEnabledaby truepodczas debugowania. Co to jest NSZombie? Czy to ramy? Ustawienie?

Mosze
źródło
18
Nieumarły obiekt NSObject - uwaga!
vikingosegundo
5
* Nieumarły obiekt NSO.
Alex Zavatone

Odpowiedzi:

192

To pomoc w debugowaniu pamięci. W szczególności, gdy ustawisz NSZombieEnabledto, gdy obiekt osiągnie liczbę zachowań 0, zamiast zostać zwolniony, przekształca się w NSZombieinstancję. Za każdym razem, gdy taki zombie otrzyma wiadomość, rejestruje ostrzeżenie, a nie ulega awarii lub zachowuje się w nieprzewidywalny sposób. W związku z tym możesz debugować subtelne problemy z nadmiernym wydaniem / automatycznym zwolnieniem bez zaawansowanych narzędzi lub żmudnej igły w wyszukiwaniu stogów siana.

Nazwa jest dość oczywistą grą na fakcie, że przedmioty są zwykle uważane za „martwe”, gdy osiągną liczbę 0. W tym ustawieniu nadal istnieją w dziwnym okresie półtrwania - ani żywe, ani całkiem martwe. Podobnie jak prawdziwe zombie, tyle że jedzą mniej mózgów.

Adam Wright
źródło
61
Uważaj, aby usunąć to ustawienie po zakończeniu debugowania, ponieważ zasadniczo powoduje wyciek każdego obiektu.
Justin,
1
Dzięki za to proste wyjaśnienie. Informujemy, że Cocoa Dev Link już nie działa. +1 w skrócie i na temat.
CRDave,
95

Adam wykonał świetną robotę, wyjaśniając, czym są Zombie, ale używanie zmiennej środowiskowej nie jest najlepszym sposobem na ich znalezienie i śledzenie.

Znacznie lepszym podejściem do wykrywania zombie jest po prostu użycie narzędzi - od XCode zacznij od „Uruchom z instrumentem” i wybierz „Przydziały”.

Następnie zatrzymaj nagrywanie zaraz po jego rozpoczęciu, naciśnij przycisk „i” na instrumencie alokacje i włącz „włącz liczniki referencyjne” i „Włącz wykrywanie NSZombie”. Teraz ponownie naciśnij Record w instrumencie, a Twoja aplikacja uruchomi się - jeśli zostaną wysłane jakiekolwiek obiekty zombie, nagrywanie wiadomości zostanie zatrzymane, a na osi czasu nagrywania pojawi się okno dialogowe - możesz kliknąć, aby znaleźć każde miejsce, w którym obiekt był zatrzymane lub zwolnione.

Edycja: Poprzednia rada dotyczyła XCode 3, oto dodatek do XCode 4:

W XCode 4.2 jest jeszcze łatwiejszy mechanizm wykorzystania wykrywania zombie - Zombie Instrument. Zamiast „Uruchom”, aby uruchomić aplikację, użyj opcji „Profil”, a pojawi się selektor instrumentów. Wybierz „Zombie”, a aplikacja zacznie działać - zrób wszystko, co spowodowało awarię, pojawi się okno dialogowe z komunikatem „Zombie Messaged”.

Następnie kliknij małą strzałkę w oknie dialogowym. Spowoduje to wyświetlenie listy wszystkich czasów, gdy obiekt zombie został utworzony, zachowany lub wydany. Podciągnij boczny pasek i możesz przejść do każdego wpisu, patrząc na ślad stosu dla kodu, który był odpowiedzialny za każdą korektę liczby zatrzymań.

Kendall Helmstetter Gelner
źródło
2
To niezwykle przydatna rada.
Donahue,
4
Zaktualizowałem odpowiedź dla XCode 4, ponieważ sprawia, że ​​wykrywanie zombie w Instrumentach jest jeszcze łatwiejsze.
Kendall Helmstetter Gelner
Niezupełnie, powinno działać prawie tak samo z XCode 5 i 6.
Kendall Helmstetter Gelner
2
Mogę to również potwierdzić za pomocą XCode 7.2
Beat
31

Zgadzam się z tym, co dodał Kendall, jest to bardzo przydatne, ale sugeruję nadal robić zmienne środowiskowe, aby nie zapomnieć, że są włączone. Podobnie jak (wygasły) link w Cocoa Dev, umieściłem to, aby go nie przegapić:

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

Bardzo ładnie przykuwa moją uwagę.

Matthew Frederick
źródło