Jak skonfigurować NSZombieEnabled w Xcode 4?


456

Jak skonfigurować NSZombieEnabledi CFZombieLeveldla mojego pliku wykonywalnego w Xcode 4?


1
pytasz o Xcode 4?
Jehowa

8
Dlaczego opcje takie jak ta nie są domyślnie włączone, jest poza mną ...
Daniel Magnusson

26
Ponieważ w zasadzie zapobiega to rzeczywistemu zwolnieniu pamięci, co domyślnie nie wydaje się dobrym pomysłem.
Chetan

14
@Daniel Magnusson: to przeżycie najlepiej przystosowane. Sprawiając, że programowanie w XCode jest nieprzyjazne, ale wykonalne, zyskujesz lepszych programistów. Żartuję.
Dan Rosenstark

3
@DanielMagnusson Myślę, że to nie jest zły pomysł, AFAIK w trybie „Zombie” zmieni każdy obiekt w specjalny obiekt ob, aby mógł wykryć, kiedy otrzyma wysłane wiadomości. Tak więc włączenie „Trybu zombie” spowoduje, że żaden obiekt nie zostanie nigdy zwolniony, więc naprawdę powinieneś go używać tylko podczas usuwania takich błędów.
Besi

Odpowiedzi:


753

W Xcode 4.x naciśnij

R

(lub kliknij Menubar> Product> Scheme> Edit Scheme)

wybierz kartę „Diagnostyka” i kliknij „Włącz obiekty zombie”:

Kliknij „Włącz obiekty zombie”

Powoduje to, że uwolnione obiekty stają się instancjami NSZombie, które po ponownym użyciu drukują ostrzeżenia konsoli. Jest to pomoc w debugowaniu, która zwiększa wykorzystanie pamięci (żaden obiekt nie jest tak naprawdę uwalniany), ale poprawia raportowanie błędów.

Typowym przypadkiem jest nadmierne zwolnienie obiektu i nie wiadomo, który z nich:

  • Z zombie: -[UITableView release]: message sent to deallocated instance
  • Bez zombie: EXC_BAD_ACCESS

To ustawienie Xcode jest ignorowane podczas archiwizowania aplikacji do przesłania do App Store. Nie musisz nic dotykać przed zwolnieniem aplikacji.

Naciśnięcie Rjest takie samo, jak wybranie opcji Produkt> Uruchom przy jednoczesnym przytrzymaniu Altklawisza.
Kliknięcie pola wyboru „Włącz obiekty zombie” jest takie samo, jak ręczne dodanie „NSZombieEnabled = TAK” w sekcji „Zmienne środowiskowe” na karcie Argumenty.


27
Dzięki - zastanawiałem się, gdzie ukryli te opcje. Teraz zdaję sobie sprawę, że jest to to samo okno, co w menu „Edycja schematu”.
emp

1
Wystarczy dodać do tego, robiąc to na ekranie „Uruchom” ustawia to również na „Test”, jeśli pole „Użyj opcji działania Uruchom” jest zaznaczone. Jeśli chcesz to zrobić tylko podczas testu, to pole musi być odznaczone
Cameron

1
Należy również pamiętać, że ta opcja pojawia się w Xcode 4.1 (prawda?)
phi

2
W XCode 5 (i późniejszych wersjach 4 - 4.3.x na pewno, może wcześniej), jest to CMD-<( CMD-SHIFT-comma) lubProduct -> Scheme -> Edit SCheme...
Olie

1
Utknąłem w dziwnym problemie EXC_BAD_ACCESS, nawet zombie są pomijane, byłoby miło, gdybyś mógł skierować mnie do tego stackoverflow.com/questions/29210057/...
Anoop Vaidya

70

Odpowiedź Jano jest najłatwiejszym sposobem na znalezienie tego. Innym sposobem byłoby kliknięcie rozwijanego paska schematu -> edycja schematu -> zakładka argumenty, a następnie dodanie NSZombieEnabled w kolumnie Zmienne środowiskowe i TAK w kolumnie wartości ...


57

Uważam tę alternatywę za wygodniejszą:

  1. Kliknij „Lista rozwijana przycisku uruchamiania”
  2. Z listy wybierz Profile
  3. Program „Instrumenty” powinien zostać otwarty, w którym można również wybrać Zombies
  4. Teraz możesz wchodzić w interakcje z aplikacją i próbować powodować błąd
  5. Gdy tylko wystąpi błąd, powinieneś otrzymać wskazówkę, kiedy obiekt został zwolniony, a zatem zwolniony.

Zombie

Gdy tylko zostanie wykryty zombie, otrzymasz zgrabny „stos zombie”, który pokazuje, kiedy przedmiot został przydzielony i gdzie został zachowany lub zwolniony:

Event Type    RefCt     Responsible Caller
Malloc            1     -[MyViewController loadData:]
Retain            2     -[MyDataManager initWithBaseURL:]
Release           1     -[MyDataManager initWithBaseURL:]
Release           0     -[MyViewController loadData:]
Zombie           -1     -[MyService prepareURLReuqest]

Zalety w porównaniu do korzystania z karty diagnostycznej schematów Xcode :

  1. Jeśli zapomnisz odznaczyć opcję na karcie diagnostycznej, żadne obiekty nie zostaną zwolnione z pamięci.

  2. Otrzymasz bardziej szczegółowy stos, który pokazuje, w jaki sposób uszkodzony obiekt został przydzielony / zwolniony lub zatrzymany.


1
Dlaczego w moim XCode 4 brakuje opcji „Zombie”?
Li Fumin

4
Upewnij się, że wybierasz iOS Simulator > Allz głównej listy szablonów (możesz to zrobić tylko w symulatorze)
Besi

z jakiegoś powodu .. jeśli wybiorę „zombie”, pokaże tylko przydziały… jakiś pomysł, dlaczego?
przeżył

To najlepsze rozwiązanie. Bardzo mi
pomogło

5

W Xcode 4.2

  • Nazwa projektu / Edycja schematu / Diagnostyka /
  • Zaznacz pole wyboru Zombie Objects
  • Jesteś skończony


1

Kakao oferuje fajną funkcję, która znacznie zwiększa twoje możliwości debugowania takich sytuacji. Jest to zmienna środowiskowa o nazwie NSZombieEnabled, obejrzyj ten film wyjaśniający konfigurację NSZombieEnabled w celu-C


-1

W Xcode> 4.3:

Kliknij rozwijany pasek schematu -> edytuj schemat -> kartę argumentów, a następnie dodaj NSZombieEnabled w kolumnie Zmienne środowiskowe i YES w kolumnie wartości.

Powodzenia !!!

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.