Edycja lutego 2014: Zwróć uwagę, że to pytanie pochodzi z iOS 2.0! Od tego czasu wymagania dotyczące obrazu i obsługa znacznie się zmieniły. Retina powiększa obrazy i ładuje je nieco bardziej skomplikowane. Dzięki wbudowanej obsłudze obrazów iPada i siatkówki, z pewnością powinieneś używać ImageNamed w swoim kodzie .
Widzę, że wiele osób twierdzi, że imageNamed
jest źle, ale równa liczba osób twierdzi, że wydajność jest dobra - zwłaszcza podczas renderowania UITableView
s. Zobacz na przykład to pytanie SO lub ten artykuł na iPhoneDeveloperTips.com
UIImage
„s imageNamed
metoda stosowana przeciekać tak było najlepiej unikać, ale został naprawiony w najnowszych wersjach. Chciałbym lepiej zrozumieć algorytm buforowania, aby podjąć uzasadnioną decyzję o tym, gdzie mogę zaufać systemowi buforując moje obrazy i gdzie muszę zrobić więcej i zrobić to sam. Mój obecny podstawowe zrozumienie, że to prosta NSMutableDictionary
od UIImages
odwołuje pliku. Zwiększa się, a kiedy kończy się pamięć, robi się znacznie mniejsza.
Na przykład, czy ktoś wie na pewno, że pamięć podręczna obrazu za nią imageNamed
nie reaguje didReceiveMemoryWarning
? Wydaje się mało prawdopodobne, aby Apple tego nie zrobił.
Jeśli masz wgląd w algorytm buforowania, opublikuj go tutaj.
Odpowiedzi:
tldr: ImagedNamed jest w porządku. Dobrze radzi sobie z pamięcią. Użyj go i przestań się martwić.
Edytuj listopad 2012 : Zwróć uwagę, że to pytanie pochodzi z iOS 2.0! Od tego czasu wymagania dotyczące obrazu i obsługa znacznie się zmieniły. Retina powiększa obrazy i ładuje je nieco bardziej skomplikowane. Dzięki wbudowanej obsłudze obrazów iPada i siatkówki, z pewnością powinieneś używać ImageNamed w swoim kodzie. Teraz, dla dobra potomnych:
Wątek siostra na forum jabłko Dev otrzymał jakieś lepsze ruchu. W szczególności Rincewind dodał trochę autorytetu.
ostrzegając, że
i
Więc masz to. imageNamed: nie rozbije okien ani nie zamorduje twoich dzieci. To całkiem proste, ale jest to narzędzie optymalizacyjne. Niestety jest źle nazwany i nie ma odpowiednika, który byłby tak łatwy w użyciu - stąd ludzie nadużywają go i denerwują się, gdy po prostu wykonuje swoją pracę
Dodałem kategorię do UIImage, aby to naprawić:
Rincewind dołączył również przykładowy kod do zbudowania własnej zoptymalizowanej wersji. Nie sądzę, że warto go utrzymać, ale tutaj jest to kompletność.
Wadą tego kodu jest to, że zdekodowany obraz zużywa więcej pamięci, ale renderowanie jest szybsze.
źródło
Z mojego doświadczenia wynika, że pamięć podręczna obrazu utworzona przez imageNamed nie reaguje na ostrzeżenia dotyczące pamięci. Miałem dwie aplikacje, które były tak oszczędne, jak tylko mogłem, jeśli chodzi o zarządzanie pamięcią, ale nadal w niewytłumaczalny sposób ulegały awarii z powodu braku pamięci. Kiedy przestałem używać imageNamed do ładowania obrazów, obie aplikacje stały się znacznie bardziej stabilne.
Przyznam, że obie aplikacje ładowały dość duże obrazy, ale nic, co byłoby całkowicie niezwykłe. W pierwszej aplikacji po prostu całkowicie pominąłem buforowanie, ponieważ było mało prawdopodobne, że użytkownik wróci do tego samego obrazu dwa razy. W drugim utworzyłem naprawdę prostą klasę buforującą, robiąc to, o czym wspomniałeś - utrzymując UIImages w NSMutableDictionary, a następnie opróżniając jego zawartość, jeśli otrzymałem ostrzeżenie dotyczące pamięci. Jeśli imageNamed: miałby tak buforować, nie powinienem był widzieć żadnej aktualizacji wydajności. Wszystko to działało w wersji 2.2 - nie wiem, czy ma to jakieś konsekwencje w wersji 3.0.
Moje inne pytanie dotyczące tego problemu z mojej pierwszej aplikacji można znaleźć tutaj: Pytanie StackOverflow dotyczące buforowania UIImage
Jeszcze jedna uwaga - InterfaceBuilder używa imageNamed pod okładkami. Coś, o czym należy pamiętać, jeśli napotkasz ten problem.
źródło