2009-01-21 14 views
8

Potrzebuję lekcji w zarządzaniu pamięcią. Mam aplikację, która używa wielu widoków (około 10), niektóre z nich są dołączone do kontrolera kart. Problem polega na tym, że używam obrazów (wiele obrazów, które ładuję z usługi sieciowej). Mam do czynienia z następującymi problemami.Rozwój iPhone'a - Lekcje zarządzania pamięcią

  1. Pamięć stale wzrasta, kiedy przewijać w widoku tabeli (dlaczego?) - Sprawdziłem aplikację CustomTableViewCell ze strony Apple, i to pokazuje te same znaki, gdy uruchomię go z instrumentami.

  2. Używam autoreasytów z wieloma obiektami, ale widzę, że te obiekty w rzeczywistości nie zostają zwolnione, a pamięć jest podłączona. Jak mogę pozbyć się tych obiektów?

  3. Jak mogę powiedzieć NSAutoreleasePool, aby okresowo zwalniało obiekty, które nie są używane? Myślę, że to pomoże mi pozbyć się przewodowej pamięci. Ale czy mogę to zrobić?

Czy istnieje jakiś przykład przez Apple lub kogoś innego (książki lub artykułów online) wyjaśniając, jak użyć Instruments (w trochę szczegółów z przykładem?) I dostroić wniosku o pamięci i wydajności?

Dzięki.

Odpowiedz

8

Po tym, jak mamy odpowiedzi "po prostu odmów", aby autorelease zniknęły z drogi, pomyślałem, że dodaję wskazówkę, jak efektywniej używać autorelease. Na dobre i na złe nie wszyscy całkowicie unikną autoreleaseu - jeśli nie z innego powodu, niż dlatego, że Apple zapewnia tak wiele wygodnych metod, które umożliwiają ręczne autoreleased obiektów.

Nie można po prostu powiedzieć puli autorelease, aby zwolnić wszelkie obiekty, których nie używasz. Nie ma zbierania śmieci i jak inaczej to będzie wiedzieć?

Co możesz zrobić, to utworzyć lokalną pulę autorelease, a następnie zwolnij ją, gdy nie będziesz już potrzebował lokalnych autoreleased obiektów. Jeśli masz blok, w którym tworzysz autorejestrowane obiekty, upewnisz się, że zostaną uwolnieni, tworząc pulę autoreleaseów lokalnych na początku bloku (po prostu przydzielaj/inicjuj, bez magii), a następnie zwalniając pulę na początku koniec bloku.I voila, a przedmioty w basenie również są uwalniane.

Autorelease pule gniazd, więc miej to na uwadze, jeśli to zrobisz. Jeśli zwolnisz pulę autoreas, upewnij się, że jest to ostatnio przydzielona pula, a nie jakaś inna.

1

Autorejestrowana pamięć jest zwalniana, gdy sterowanie jest zwracane z powrotem do systemu, ale tylko wtedy, gdy wybierze. Jeśli chcesz wymusić zwolnienie pamięci, użyj "wydania", które działa tam i wtedy.

Należy zauważyć, że z powodu fragmentacji pamięci, alokowanie i zwalnianie bloku pamięci może nie przywrócić cię do miejsca, w którym zaczynałeś od wymiernej "wolnej" pamięci.

Tony

1

Ze względu na wydajność, Apple zaleca, aby zachować/release sprzeciwia się w miarę możliwości. ich autorelowanie może spowodować nadmierne zużycie pamięci, ponieważ autorejestrowane obiekty nie zawsze są natychmiast uwalniane.

Innymi słowy, jeśli wiesz, że skończyłeś z obiektem, jawnie go zwolnij.

0

Według Apple, nie powinieneś używać autorelease, a zamiast tego powinien zachować i zwolnić obiekty jawnie w razie potrzeby. autorelease nie zwolni obiektu, gdy tylko jego funkcja się skończy. Jeśli w widoku tabeli używasz obrazów pobranych z usługi sieciowej, spróbuj buforować te obrazy i użyć ich ponownie, jeśli to możliwe. Inną opcją jest uzyskanie tylko tych obrazów, które są wyświetlane.

1

UITableView ma sposób na ponowne wykorzystanie komórek tabeli, które nie są już wyświetlane. W ten sposób, jeśli jednocześnie wyświetlisz tylko 6 komórek na ekranie, nie będzie on nadal tworzyć więcej podczas przewijania, ale ponownie użyje komórek, które zniknęły z ekranu. ilekroć chcesz utworzyć nową komórkę, najpierw zapytaj o tabelę, czy ma ją ponownie użyć, a jeśli nie, utwórz nową.

przykład tego można znaleźć na slajdzie 55 notatki kursu iPhone Standford znaleźć tutaj: http://www.scribd.com/doc/7671058/Standford-CS-193P-11Performance