Jak debugować "Wiadomość wysłana do zdalokowanej instancji" w Xcode4?

Wcisnąłem ALT + CMD+R i aktywowałem NSZombieEnabled w argumentach > zmiennych środowiskowych. Dodatkowo aktywowałem go w Diagnostyka > zarządzanie pamięcią > Włącz Obiekty Zombie.

Jednak, kiedy zbudowałem i uruchomiłem, w pewnym momencie Moja aplikacja zawiesza się, dając mi ten bezużyteczny komunikat w konsoli:

*** -[CALayer retainCount]: message sent to deallocated instance 0x656b260

Ślad stosu jest równie bezużyteczny. Przesunąłem suwak na poziomie szczegółów w prawo. Thread 1 po prostu pokazuje mi to:

zrzut ekranu

Wszystko jest właścicielem systemu i nie ma ani jednej linii związanej z moją aplikacją. Więc oczywiście NSZombiesEnabled nie działa tak jak w Xcode 3, gdzie zatrzymał się na martwym obiekcie.

Czy Jest jakiś sposób, aby dowiedzieć się który CALayer jest zbyt wcześnie dealokowany?

Aktualizacja: więc po zbudowaniu i uruchomieniu około 100 więcej razy nagle problem zniknął! Całkowicie zniknął! A co najlepsze: w żaden sposób nie zmodyfikowałem kodu! Inbetween wyczyściłem folder budowania i projekt z Wyczyść polecenia kilka razy i kilka razy usunął aplikację w symulatorze.

Aktualizacja 2: Na szczęście problem pojawił się ponownie. A teraz wydaje się uporczywy. Na szczęście, ponieważ wolę znaleźć przyczynę, a nie denerwować użytkowników losowo.

Update 3: W końcu znalazłem to przez przypadek:

startButton = newBttn;

Powinno być:

self.startButton = newBttn;

StartButton był własnością zatrzymanego i in-dealloc ja go wypuściłem. Więc się przesadziło i w większości (ale nie we wszystkich) przypadków po wyblaknięciu widoku zawiesił się, dając tę dziwną wiadomość caleyer retainCount.

Instrument Zombie (CMD + I) w końcu wskazał, że ma to związek z przyciskiem. Po prostu nie wiedziałem, dlaczego i gdzie.

Clang Static Analyzer nie narzekał na tę oczywistą usterkę.
Author: dontWatchMyProfile, 2011-11-28

2 answers

Jeśli pojawi się ponownie, możesz uruchomić dedykowany instrument Zombie. Naciśnij Command+I, aby profilować aplikację i wybrać instrument Zombie (musisz być uruchomiony na symulatorze). Jeśli pojawi się zombie, możesz wyświetlić całą historię pamięci (każde zachowanie/zwolnienie) dla tego obiektu, co jest niezmiernie pomocne w śledzeniu błędów.

 93
Author: Jeff Kelley,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-28 16:57:24

Oprócz świetnej odpowiedzi Jeffa; aby zrobić prawie to samo, ale bez konieczności otwierania instrumentów lub profilowania aplikacji, możesz ustawić NSZombieEnabled, MallocStackLogging i pilnuje malloca w debuggerze. Następnie, gdy aplikacja ulegnie awarii, wpisz to w konsoli gdb:

(gdb) info malloc-history 0x543216

Zastąp 0x543216 adresem obiektu, który spowodował awarię, a otrzymasz o wiele bardziej użyteczny ślad stosu i powinien pomóc w określeniu dokładnej linii w kodzie to jest przyczyną problemu.

Ten artykuł ma kilka dodatkowych infoz.

 50
Author: chown,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-29 00:01:49