Edit Février 2014: Notez que cette question date d'iOS 2.0! Les exigences et la gestion des images ont beaucoup évolué depuis. Retina agrandit les images et leur chargement un peu plus complexe. Avec la prise en charge intégrée des images iPad et Retina, vous devez certainement utiliser ImageNamed dans votre code .
Je vois beaucoup de gens dire que imageNamed
c'est mauvais, mais un nombre égal de personnes dire que la performance est bonne - en particulier lors du rendu UITableView
. Voir cette question SO par exemple ou cet article sur iPhoneDeveloperTips.com
UIImage
La imageNamed
méthode utilisée pour fuir était donc mieux évitée, mais a été corrigée dans les versions récentes. J'aimerais mieux comprendre l'algorithme de mise en cache afin de prendre une décision raisonnée sur l'endroit où je peux faire confiance au système pour mettre en cache mes images et où je dois faire un effort supplémentaire et le faire moi-même. Mon actuelle compréhension de base est qu'il est simple NSMutableDictionary
de UIImages
référencé par nom de fichier. Il devient plus gros et lorsque la mémoire est épuisée, il devient beaucoup plus petit.
Par exemple, est-ce que quelqu'un sait avec certitude que le cache d'image derrière imageNamed
ne répond pas didReceiveMemoryWarning
? Il semble peu probable qu'Apple ne fasse pas cela.
Si vous avez un aperçu de l'algorithme de mise en cache, veuillez le poster ici.
Réponses:
tldr: ImagedNamed est très bien. Il gère bien la mémoire. Utilisez-le et arrêtez de vous inquiéter.
Edit Nov 2012 : Notez que cette question date d'iOS 2.0! Les exigences et la gestion des images ont beaucoup évolué depuis. Retina agrandit les images et leur chargement un peu plus complexe. Avec la prise en charge intégrée des images iPad et Retina, vous devez certainement utiliser ImageNamed dans votre code. Maintenant, pour la postérité:
Le fil sœur sur les forums Apple Dev a reçu un meilleur trafic. Plus précisément, Rincevent a ajouté une certaine autorité.
tout en avertissant que
et
Alors, voilà. imageNamed: ne brisera pas vos fenêtres ni ne tuera vos enfants C'est assez simple mais c'est un outil d'optimisation. Malheureusement, il est mal nommé et il n'y a pas d'équivalent qui soit aussi facile à utiliser - par conséquent, les gens en abusent et s'énervent quand il fait simplement son travail
J'ai ajouté une catégorie à UIImage pour résoudre ce problème:
Rincewind a également inclus un exemple de code pour créer votre propre version optimisée. Je ne vois pas que cela vaut la peine de le maintenir mais ici, c'est pour être complet.
Le compromis avec ce code est que l'image décodée utilise plus de mémoire mais le rendu est plus rapide.
la source
D'après mon expérience, le cache d'image créé par imageNamed ne répond pas aux avertissements de mémoire. J'ai eu deux applications qui étaient aussi minces que je pouvais les obtenir en ce qui concerne la gestion des mémoires, mais qui tombaient toujours inexplicablement en panne en raison du manque de mémoire. Lorsque j'ai arrêté d'utiliser imageNamed pour charger les images, les deux applications sont devenues considérablement plus stables.
J'avoue que les deux applications ont chargé des images un peu volumineuses, mais rien de tout à fait hors de l'ordinaire. Dans la première application, j'ai simplement ignoré la mise en cache car il était peu probable qu'un utilisateur revienne deux fois à la même image. Dans le second, j'ai construit une classe de mise en cache très simple faisant exactement ce que vous avez mentionné: conserver UIImages dans un NSMutableDictionary, puis vider son contenu si je recevais un avertissement de mémoire. Si imageNamed: devait mettre en cache comme ça, alors je n'aurais pas dû voir de mise à niveau des performances. Tout cela fonctionnait sur 2.2 - je ne sais pas s'il y a des implications 3.0 à ce sujet.
Vous pouvez trouver mon autre question sur ce problème à partir de ma première application ici: Question StackOverflow sur la mise en cache UIImage
Une autre note - InterfaceBuilder utilise imageNamed sous les couvertures. Quelque chose à garder à l'esprit si vous rencontrez ce problème.
la source