2013-03-08 11 views
8

Obawiam się, że tym pytaniem może spowodować w niektórych downvotes, ale po co jakiś niespełniającego badań postanowiłem zaryzykować i zapytać bardziej doświadczonych ludzi ...Jakiego rodzaju wycieki pamięci XCode Analyzer może nie zauważyć?

Istnieje tu wiele pytań odnoszących się do niektórych specyficznych problemy związane z narzędziem XCode Analayzer. Wydaje się to bardzo pomocnym rozwiązaniem. Ale chciałbym cię zapytać - jako początkujący w świecie iOS - jakie narzędzia do zarządzania pamięcią nie mogą być zauważone przez to narzędzie.

Innymi słowy, czy są jakieś wspólne aspekty zarządzania pamięcią, o których początkujący iOS powinni myśleć "Och, bądźcie ostrożni z tym, ponieważ w tym przypadku XCode Analyzer może nie ostrzec was o waszym błędzie" ...

Na przykład, znalazłem tutaj Why cannot XCode static analyzer detect un-released retained properties? że:

(...) analizator nie może niezawodnie wykrywać problemy zachowują/uwolnienia całej granicach metoda/Library (...)

Brzmi jak dobra wskazówka do rozważenia, ale może wiedzieć o kilku innych kwestiach wspólnych ...

+1

To, że narzędzie wykrywa wyciek, nie oznacza, że ​​nie należy mniej uważać na zarządzanie pamięcią. To narzędzie, a nie zastąpienie starannej myśli. –

Odpowiedz

7

Analizator jest bardzo dobry w znalezieniu rutynowych przecieki, który jest plagą nowych programistów do pisania kodu non-ARC (niepowodzeń zadzwoń pod numer release, zwracając obiekty o niewłaściwej liczbie zatrzymań itp.).

Z mojego doświadczenia wynika, istnieje kilka rodzajów problemów z pamięcią nie znajdzie:

  • Nie można generalnie identyfikować strong reference cycles (a.k.a. retain cycles). Na przykład do kontrolera podglądu dodajesz powtarzający się NSTimer, nieświadomy, że licznik czasu utrzymuje silne odniesienie do kontrolera widoku, a jeśli nie masz invalidate licznika czasu (lub wykonaj go w niewłaściwym miejscu, na przykład w metodzie dealloc) , ani kontroler widoku, ani timer nie zostaną zwolnione.

  • Nie można znaleźć błędów logiki kolistej. Na przykład, jeśli masz jakieś okrągłe odniesienia, gdzie kontroler widoku A przedstawia kontroler widoku B, który z kolei przedstawia nową kopię A (zamiast odrzucania/trzaskania, aby powrócić do A).

  • Nie można znaleźć wielu niereferencyjnych problemów z pamięcią zliczającą. O ile lepiej radzi sobie z funkcjami Core Foundation, jeśli posiadasz kod, który wykonuje ręczne przydzielanie pamięci (np. Przez malloc i free), analizator statyczny może mieć ograniczone zastosowanie. To samo obowiązuje, gdy używasz kodu kodu nie zawierającego odwołania (np. Używasz SQLite sqlite3_prepare_v2 i nie wywołujesz sqlite3_finalize).

Jestem pewien, że nie jest to pełna lista, co nie znajdzie, ale te są wspólne problemy widzę poprosił o na przepełnienie stosu na którym analizator statyczny będzie mieć ograniczoną pomoc. Jednak analizator wciąż jest wspaniałym narzędziem (również poza problemami z pamięcią), a dla osób, które nie używają ARC, jest nieoceniony.

Powiedziawszy, że chociaż analizator statyczny jest niedocenioną pierwszą linią obrony, naprawdę powinieneś używać Instrumentów do wykrywania nieszczelności. Zobacz Locating Memory Issues in Your App w Instrukcji użytkownika instrumentów . To najlepszy sposób na identyfikację wycieków.

+0

Czy mógłbyś wyjaśnić nieco więcej powodów, dla których byłoby źle "unieważnić" swój timer w dealloc? –

+3

@MarkBernstein Komenda 'dealloc' jest wywoływana tylko wtedy, gdy nie ma już silnych odwołań do kontrolera widoku. Tak więc, ponieważ powtarzający się zegar utrzymuje silne odniesienie do kontrolera widoku, nigdy nie zostanie wywołany. Umieszczenie 'unieważniającego' w' dealloc' jest analogiczne do powiedzenia "kiedy nie ma już silnych odniesień do tego kontrolera widoku, proszę śmiało usunąć silne odniesienie timera do tego kontrolera widoku." Generalnie umieścisz 'unieważnij' w' viewWillDisappear' lub coś w tym stylu, w zależności od szczegółów twojej aplikacji. – Rob

Powiązane problemy