Co to jest NSZombie?


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.


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ń.


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ę.


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.