Chciałbym dowiedzieć się więcej o zarządzaniu pamięcią w Objective-C, co nie jest takie proste, ponieważ jestem dość nowy w Objective-C i ARC i jestem głównie przy pisaniu języków, dla których nie muszę tak wiele (lub wcale) radzić sobie z zarządzaniem pamięcią.Kiedy kontroler widoku zostanie zwolniony, czy powinien opróżnić pamięć?
Aplikacja, nad którą pracuję, prezentuje kod viewController (z załączonym plikiem xib) z kodu po naciśnięciu przycisku. W tym kontroler widoku mam kilka widoków utworzonych; Nagrywam sekwencję obrazów (zdjęcie z kamery, zapisanych na dysku), które zamieniam na film i mam tracker GPS (mapKit), który wyświetla trochę mapy na ekranie. Mimo wszystko odbywa mogę wcisnąć przycisk „Gotowe”, która wywołuje [self dismissViewControllerAnimated:YES completion:nil];
viewController jest animowany z powrotem do mojego rootViewController i dlatego kładę komunikat NSLog
wewnątrz metody w viewController dealloc
która jest oddalona mogę potwierdzić tej viewController jest zwalniany.
Problem polega na tym, że widzę wzrost pamięci po użyciu aplikacji (użycie składa się z robienia zdjęć i rejestrowania lokalizacji GPS na mapie MapKit oraz generowania pliku filmowego) do około 80 MB i spada do około 70 MB po naciśnięciu przycisku "done", aby viewController został odrzucony, a aplikacja wraca do mojego rootViewController. Mogę ponownie zaprezentować ten sam viewController, użyć go i odrzucić, a aplikacja będzie nadal zajmować około 70 MB pamięci, która nie spada. To naprawdę nie wygląda na wyciek pamięci do mnie, ponieważ w takim przypadku spodziewałbym się stałego wzrostu pamięci przy każdym utworzeniu i zwolnieniu kontrolki viewController. Nie dzieje się tak, nawet jeśli mam różne przyciski w moim rootViewController, które wszystkie tworzą instancję nowego i unikalnego wystąpienia mojej klasy viewController.
Zastanawiam się: czy jest coś, czego powinienem szukać, czy jest to oczekiwane zachowanie? Może aplikacja buforuje klasy do wykorzystania w przyszłości? Czy przy prawidłowym zarządzaniu pamięcią powinienem oczekiwać, że aplikacja powróci do stanu "pierwotnego" pamięci (w tym przypadku będzie to około 4 MB) po zwolnieniu jedynego wyświetlonego kontrolera viewController?
Profiluj aplikację, używając * Wycieków * w obszarze "Instrumenty". – trojanfoe
Gotowe, nie wykryto wycieków. – Hype1
Możesz przeczytać [ten Q & A] (http://stackoverflow.com/q/12641658/335858), mówi o problemie z pamięcią MapKit. Pytania i odpowiedzi są jednak stare, więc mogły zostać rozwiązane. – dasblinkenlight