2012-02-04 11 views
10

Przesłałem stary kod do układu ARC z obiektywnym C (automatyczne liczenie odniesienia) i wygląda na to, że działa świetnie. Z wyjątkiem dość dużego, wysokiego poziomu obiektu, który nie jest zwolniony, gdy jest wyrzucony z mojego stosu nawigacyjnego, co sprawia, że ​​wierzę, że mam cykl zatrzymania w miejscu, które ARC ukrył przede mną (a przynajmniej utrudniło to odnalezienie). Jaki jest najlepszy sposób na wyeliminowanie tego potencjalnego cyklu zatrzymania i/lub jaki jest dobry sposób na określenie przyczyny wycieku pamięci w ARC? Dzięki!Łukowe wykrywanie zatrzymania ARC

Odpowiedz

16

Najlepszym sposobem jest zwykle użycie the Leaks instrument in the Instruments app.

Co nowego w Instruments wideo z WWDC 2011 omawia użycie instrumentów znaleźć zachować cykli pod ARC, rozpoczynając około 38 minut w.

+0

Looks jak znalazłem! Gdyby odwołanie do bloku było __unsafe_unretained; zmienił go na __weak __block dla loli i wygląda na to, że naprawił go. UWAGA: Instrumenty NIE ZNAJDOWAŁY TEGO i rzeczywiście nie oznaczyły tego jako potencjalnej sytuacji wycieku. Dzięki za sugestię! – Grimless

+0

Ups, po kilku dodatkowych kopaniu, okazuje się, że wyciek wciąż jest w pobliżu. Ale przecieka tylko wtedy, gdy wciskam go na stos nawigacyjny ... Jeśli użyję opcji -init lub -initWithNibName: bundle :, a następnie nil to jest referencja, zwalnia poprawnie. W przeciwnym razie, kiedy popchnę to na stos nawigacyjny, a następnie go wyskoczę, nigdy nie zwolni. – Grimless

26

Właśnie przesiedli starszą aplikację do korzystania z ARC. Instrumenty nie wykazywały przecieków, ale alokacje nadal rosły. Zauważyłem, że patrząc na obiekty na żywo dla czegoś, co wiedziałem, że powinien zostać usunięty, udało mi się wyśledzić zatrzymania bez wydania. Oto podstawowe kroki:

  1. użyć narzędzia alokacje w instrumenty
  2. grać za pomocą aplikacji na chwilę (jeśli wiesz, co nie jest zwolniony, to idzie szybciej)
  3. Zmiany Statystyk do obiektów w pasku skoku Allocations
  4. Sortuj według kategorii i znaleźć nazwę klasy swojej niepublikowane obiektu
  5. znaleźć żywą instancji i kliknij małą strzałkę w prawo obok adresu pamięci
  6. teraz można zobaczyć historię re Górach i komunikaty dla obiektu

Screenshot of object history in Instruments