2013-02-07 11 views
5

Podczas profilowania aplikacji zauważam, że liczba bajtów na żywo wzrasta o około 250 KB za każdym razem, gdy wykonuję określone działania (z udziałem UIViews).XCode - zrozumienie instrumentu alokacji

Patrząc na listę obiektów, główny (rosnący) winowajca po prostu czyta się jako "malloc 144 bajty".

Od czasu do czasu użyłem przyrządu do przydziału, aby odkryć przedmioty, które trzymałem dłużej niż chciałbym, ale nie jestem pewien, jak interpretować obiekty "malloc".

Wszelkie wskazówki będą mile widziane.

+0

Czy używasz danych podstawowych przez przypadek? –

+0

Nie, ale ładuję 256 UIImageViews i stale aktualizuję ich warstwy. – achiral

+0

Nie jestem pewien, moja aplikacja ma kilka zatrzymanych mallocs też, ale nie mogę zrozumieć ich, albo, moje całkowite zużycie pamięci pozostaje poniżej 10 megs, więc naprawdę nie ścigałem niczego oprócz id być zainteresowany w odpowiedzi, jak również. –

Odpowiedz

11

Kilka myśli:

  1. Przydziały narzędzie jest wielki, ale ja skupię się na Leaks najpierw. Czy masz tam czyste zdrowie?

  2. Uruchomiłeś kod za pomocą analizatora statycznego ("Analiza" w menu "Produkt"). Zwłaszcza w kodzie niezgodnym z ARC może to oznaczać wiele problemów.

  3. Czy używasz ARC? Jeśli tak, to zawęża wyszukiwanie.

  4. Czy masz włączone zombie? To spowoduje, że pamięć nie zostanie zwolniona. Upewnij się, aby wyłączyć zombie.

  5. Czy jesteś pewien, że nie masz silnego cyklu odniesienia (inaczej cyklu zatrzymania)? Możesz umieścić NSLog lub punkty przerwania w kontrolerze kontrolera widoku dealloc i upewnić się, że jest wywoływany i upewnić się, że nie masz silnego cyklu odniesienia (okrągłe odniesienie między dwoma lub więcej obiektami, które nie powoduje ich zwolnienia). (Jeśli nie masz metody dealloc, po prostu dodaj taką z instrukcją NSLog.) Niepowodzenie invalidate Powtórzenie NSTimer jest wspaniałym przykładem czegoś, co może nieumyślnie spowodować silne cykle odniesienia. Kluczową kwestią jest to, że musisz potwierdzić, że ma miejsce dealloc.

  6. Czy zdecydowanie rzucasz/oddalasz kontroler widoku, zamiast przesuwać/prezentować inną kopię innego kontrolera widoku? (Brak zobaczyć NSLog/breakpoint w metodzie dealloc może być spowodowany tym, oprócz silnego cyklu odniesienia omówione we wcześniejszym punkcie.)

  7. na własną 256 (!) Poglądów graficznych robisz imageNamed ustawić image właściwość? Metoda buforowania obrazów w trybie imageNamed nie zwalnia pamięci, dopóki nie otrzymasz ostrzeżenia o zapamiętywaniu (mimo że zajmowałaby ona pamięć tylko podczas pobierania nowych obrazów, a nie ponownego pobierania istniejących obrazów).

Podsumowując, może być mnóstwo możliwych problemów i nie ma wystarczającej ilości pytań, które pomogą nam zdiagnozować problem. Musisz pomóc nam zawęzić problem.

Ale zacznij patrzeć na swoich kontrolerów i upewnij się, że zostali zwolnieni, tak jak powinni. Czuję twój ból związany z problemami z 144 bajtami malloc, ale to mało prawdopodobne, aby był winowajcą za każdym razem zużywając 250 KB. Numer malloc jest bardziej prawdopodobnym objawem problemu, a nie źródłem problemu. Skoncentruję się na bardziej podstawowych rzeczach wymienionych powyżej, zanim poświęcę zbyt wiele czasu na wyszukiwanie źródeł wywołań malloc.