2009-03-20 11 views
9

Potrzebujesz porady, jak to debugować. Jestem nowy w ograniczonych środowiskach i nie mam doświadczenia z wbudowanym lub inteligentnym telefonowaniem, więc mogłem wykorzystać pewne wskazówki. Już wiesz o: Instrumentach, statycznej analizie Clanger, ręcznym sprawdzaniu kodu itp. Instrumenty wydają się być bardzo pomocne w ogólności, ale dość czasochłonne i zamrażają dużo czasu! Clanger również bardzo mi pomógł. Wygląda na to, że po prostu zużywam za dużo pamięci w ogóle i zastanawiam się, jaka jest dobra strategia. Czy wypuszczam niektóre obiekty najwyższego poziomu? Czy istnieje "preferowana strategia"?Najlepsze podejście do debugowania aplikacjiDidReceiveMemoryWarning na iPhone?

Zastanawiasz się, czy ktoś poradził sobie z tym z powodzeniem i czy mają jakieś inne sugestie? Dziękuje wszystkim.

Odpowiedz

2

Zasadniczo otrzymujesz to ostrzeżenie, ponieważ (co nie powinno dziwić) iPhone ma niebezpiecznie mało pamięci. Zasadniczo może to wynikać z jednego z dwóch powodów;

  1. Masz wyciek pamięci.
  2. Przydzielasz zbyt wiele obiektów i musisz ponownie sprawdzić swój projekt.

Po pierwsze należy uruchomić instrumenty i sprawdzić alokację pamięci. Może to bardzo spowolnić Twoją aplikację (i wymaga dodatkowej pamięci), więc spróbuj testować obszary swojej aplikacji po jednym na raz. Na przykład. jeśli masz kilka widoków, przełączaj się między nimi kilka razy.

Na sekundę będziesz musiał zbadać rzeczy, które robisz, co może skutkować dużymi alokacjami pamięci. Na przykład, jeśli piszesz przeglądarkę Flickr, konieczne może być zmniejszenie liczby obrazów, które załadowałeś w dowolnym momencie, lub zwolnienie niektórych nieużywanych, gdy otrzymasz to ostrzeżenie.

Są to jedyne ogólne zasady, które mogę zasugerować, nie wiedząc więcej o Twojej aplikacji.

Niestety, nie ma prawdziwej drogi (o której mi wiadomo), aby uzyskać dane na temat bieżącego przydziału pamięci z iPhone'a. To sprawia, że ​​naprawdę trudno jest wyodrębnić obszary aplikacji, które nieumyślnie są głodne pamięci.

+1

3. Ty mając do czynienia z XML sieci/images/danych, które nie mogą być załadowane wszystkim w pamięci na raz (jak pulpit) i muszą zostać uregulowane w mniejsze kawałki – slf

+0

chodzi o pomysły na lepszą projektu , przykład SQLite Books w dokumencie Apple opisuje jedną strategię nawodnienia/odwodnienia. Plik readme zapewnia doskonałe wyjaśnienie pojęcia i zawiera obiekty danych, które implementują ten wzorzec. – hyuan

5

Istnieje wiele dobrych artykułów do zarządzania pamięcią w aplikacji na iPhone'a. Oto kilka przydatnych linków.

Co należy w ogóle zająć

  1. uwolnienia wszystkich zmiennych, które nie potrzebują
  2. Zawsze obsługiwać didReceiveMemoryWarning i uwolnienia wszystkich zmiennych nie są używane
  3. zatrzymać wszystkie procesy pamięciowe ciężkich w applicationDidReceiveMemoryWarning jak gra audio/video, UIImagePickerController itp

EDIT tego nie stosuje się już więcej. imageNamed: miał problemy z buforowaniem przed wersjami 3.x OS.Problem już nie istnieje i powinieneś użyć imageNamed: (ułatwia implementację wyświetlania siatkówki)

  1. NIE używaj imageNamed: do tworzenia obiektów UIImage.
+0

Wiem, że to jest stare, ale po prostu zastanawiam się, dlaczego nr 4 powyżej? Co jest nie tak z użyciem imageNamed? – ferdil

+3

Parametr imageNamed: point nie ma teraz zastosowania. Przed 3.x, imageNamed używane do buforowania obrazów zwiększających pamięć używaną przez aplikację. Teraz bardzo ją polepszyli. Tak więc z wersją 3.x i wyższą możesz użyć tej metody. – lostInTransit