Bearbeiten Februar 2014: Beachten Sie, dass diese Frage von iOS 2.0 stammt! Die Bildanforderungen und die Handhabung haben sich seitdem stark weiterentwickelt. Die Netzhaut vergrößert Bilder und lädt sie etwas komplexer. Mit der integrierten Unterstützung für iPad- und Retina-Bilder sollten Sie ImageNamed auf jeden Fall in Ihrem Code verwenden .
Ich sehe viele Leute, die sagen, dass imageNamed
es schlecht ist, aber ebenso viele Leute, die sagen, dass die Leistung gut ist - besonders beim Rendern von UITableView
s. Siehe diese SO-Frage zum Beispiel oder diesen Artikel auf iPhoneDeveloperTips.com
UIImage
Die imageNamed
Methode, die zum Auslaufen verwendet wurde, wurde am besten vermieden, wurde jedoch in den letzten Versionen behoben. Ich möchte den Caching-Algorithmus besser verstehen, um eine begründete Entscheidung darüber zu treffen, wo ich dem System vertrauen kann, dass es meine Bilder zwischenspeichert, und wo ich die Extrameile gehen und es selbst tun muss. Mein aktuelles Grundverständnis ist , dass es ein einfache NSMutableDictionary
von UIImages
durch Dateinamen verwiesen wird . Es wird größer und wenn der Speicher knapp wird, wird es viel kleiner.
Weiß zum Beispiel jemand sicher, dass der dahinter liegende imageNamed
Bildcache nicht reagiert didReceiveMemoryWarning
? Es ist unwahrscheinlich, dass Apple dies nicht tun würde.
Wenn Sie einen Einblick in den Caching-Algorithmus haben, posten Sie ihn bitte hier.
Antworten:
tldr: ImagedNamed ist in Ordnung. Es geht gut mit dem Gedächtnis um. Verwenden Sie es und hören Sie auf, sich Sorgen zu machen.
Edit Nov 2012 : Beachten Sie, dass diese Frage von iOS 2.0 stammt! Die Bildanforderungen und die Handhabung haben sich seitdem stark weiterentwickelt. Die Netzhaut vergrößert Bilder und lädt sie etwas komplexer. Mit der integrierten Unterstützung für iPad- und Retina-Bilder sollten Sie ImageNamed auf jeden Fall in Ihrem Code verwenden. Nun, der Nachwelt zuliebe:
Der Schwester-Thread in den Apple Dev-Foren erhielt etwas besseren Traffic. Insbesondere Rincewind fügte einige Autorität hinzu.
während ich das warne
und
Also, da hast du es. imageNamed: Zerschmettert nicht Ihre Fenster und ermordet Ihre Kinder nicht. Es ist ziemlich einfach, aber es ist ein Optimierungswerkzeug. Leider ist es schlecht benannt und es gibt kein Äquivalent, das so einfach zu bedienen ist - daher wird es von den Leuten überbeansprucht und ist verärgert, wenn es einfach seinen Job macht
Ich habe UIImage eine Kategorie hinzugefügt, um dies zu beheben:
Rincewind enthielt auch Beispielcode, um Ihre eigene optimierte Version zu erstellen. Ich kann nicht sehen, dass es die Wartung wert ist, aber hier ist es der Vollständigkeit halber.
Der Nachteil dieses Codes ist, dass das decodierte Bild mehr Speicher benötigt, das Rendern jedoch schneller ist.
quelle
Nach meiner Erfahrung reagiert der von imageNamed erstellte Bildcache nicht auf Speicherwarnungen. Ich hatte zwei Anwendungen, die so schlank waren, wie ich sie bis zur Mem-Verwaltung erreichen konnte, aber immer noch unerklärlich abstürzten, weil es an Mem mangelte. Als ich imageNamed nicht mehr zum Laden der Bilder verwendete, wurden beide Anwendungen dramatisch stabiler.
Ich gebe zu, dass beide Anwendungen etwas große Bilder geladen haben, aber nichts, was völlig ungewöhnlich wäre. In der ersten Anwendung habe ich das Caching nur ganz übersprungen, da es unwahrscheinlich war, dass ein Benutzer zweimal zum selben Bild zurückkehren würde. Im zweiten Schritt habe ich eine wirklich einfache Caching-Klasse erstellt, die genau das tut, was Sie erwähnt haben - UIImages in einem NSMutableDictionary zu speichern und dann den Inhalt zu löschen, wenn ich eine Speicherwarnung erhalten habe. Wenn imageNamed: so zwischengespeichert würde, hätte ich keine Leistungssteigerung sehen sollen. All dies lief auf 2.2 - ich weiß nicht, ob es irgendwelche 3.0-Implikationen dafür gibt.
Meine andere Frage zu diesem Problem finden Sie in meiner ersten App hier: StackOverflow-Frage zum UIImage-Cache
Ein weiterer Hinweis: InterfaceBuilder verwendet imageNamed unter der Decke. Denken Sie daran, wenn Sie auf dieses Problem stoßen.
quelle