Editar febrero de 2014: tenga en cuenta que esta pregunta data de iOS 2.0. Los requisitos y el manejo de las imágenes han cambiado mucho desde entonces. Retina hace que las imágenes sean más grandes y cargarlas un poco más complejo. Con el soporte integrado para imágenes de iPad y retina, ciertamente debería usar ImageNamed en su código .
Veo a mucha gente que dice que imageNamed
es malo, pero un número igual de personas que dice que el rendimiento es bueno, especialmente al renderizar UITableView
s. Vea esta pregunta SO, por ejemplo, o este artículo en iPhoneDeveloperTips.com
UIImage
El imageNamed
método utilizado para filtrar fugas, por lo que es mejor evitarlo, pero se ha corregido en versiones recientes. Me gustaría entender mejor el algoritmo de almacenamiento en caché para poder tomar una decisión razonada sobre dónde puedo confiar en el sistema para almacenar en caché mis imágenes y dónde debo hacer un esfuerzo adicional y hacerlo yo mismo. Mi entendimiento básico actual es que se trata de un sencillo NSMutableDictionary
de UIImages
referencia por nombre de archivo. Se hace más grande y cuando la memoria se agota se vuelve mucho más pequeña.
Por ejemplo, ¿alguien sabe con certeza que el caché de imágenes detrás imageNamed
no responde didReceiveMemoryWarning
? Parece poco probable que Apple no hiciera esto.
Si tiene alguna idea sobre el algoritmo de almacenamiento en caché, publíquela aquí.
Respuestas:
tldr: ImagedNamed está bien. Maneja bien la memoria. Úsalo y deja de preocuparte.
Editar noviembre de 2012 : tenga en cuenta que esta pregunta data de iOS 2.0. Los requisitos y el manejo de las imágenes han cambiado mucho desde entonces. Retina hace que las imágenes sean más grandes y cargarlas un poco más complejo. Con el soporte integrado para imágenes de iPad y retina, ciertamente debería usar ImageNamed en su código. Ahora, por el bien de la posteridad:
El hilo hermano de los foros de desarrolladores de Apple recibió un mejor tráfico. Específicamente, Rincewind agregó algo de autoridad.
mientras advierte que
y
Así que ahí lo tienes. imageNamed: no romperá sus ventanas ni asesinará a sus hijos. Es bastante simple pero es una herramienta de optimización. Lamentablemente, tiene un nombre incorrecto y no hay equivalente que sea tan fácil de usar; por lo tanto, la gente lo usa en exceso y se molesta cuando simplemente hace su trabajo.
Agregué una categoría a UIImage para solucionar eso:
Rincewind también incluyó un código de ejemplo para crear su propia versión optimizada. No veo que valga la pena el mantenimiento, pero aquí está por completo.
La compensación con este código es que la imagen decodificada usa más memoria pero la renderización es más rápida.
fuente
En mi experiencia, el caché de imágenes creado por imageNamed no responde a las advertencias de memoria. He tenido dos aplicaciones que eran lo más sencillas que podía conseguir en cuanto a la gestión de mem, pero seguían fallando inexplicablemente debido a la falta de mem. Cuando dejé de usar imageNamed para cargar las imágenes, ambas aplicaciones se volvieron mucho más estables.
Debo admitir que ambas aplicaciones cargaron imágenes algo grandes, pero nada que fuera totalmente fuera de lo común. En la primera aplicación, simplemente omití el almacenamiento en caché porque era poco probable que un usuario regresara a la misma imagen dos veces. En el segundo, construí una clase de almacenamiento en caché realmente simple haciendo exactamente lo que mencionaste: mantener UIImages en un NSMutableDictionary y luego vaciar su contenido si recibía una advertencia de memoria. Si imageNamed: se almacenara en caché así, entonces no debería haber visto ninguna mejora de rendimiento. Todo esto se estaba ejecutando en 2.2, no sé si hay implicaciones 3.0 en esto.
Puede encontrar mi otra pregunta sobre este problema de mi primera aplicación aquí: Pregunta de StackOverflow sobre el almacenamiento en caché de UIImage
Otra nota: InterfaceBuilder usa imageNamed debajo de las cubiertas. Algo a tener en cuenta si se encuentra con este problema.
fuente