Editar fevereiro de 2014: Observe que esta questão data do iOS 2.0! Os requisitos e o manuseio de imagens mudaram muito desde então. Retina torna as imagens maiores e carregá-las um pouco mais complexas. Com o suporte integrado para imagens de iPad e retina, você certamente deve usar ImageNamed em seu código .
Vejo muitas pessoas dizendo que imageNamed
é ruim, mas um número igual de pessoas dizendo que o desempenho é bom - especialmente ao renderizar UITableView
s. Veja esta pergunta do SO, por exemplo, ou este artigo em iPhoneDeveloperTips.com
UIImage
de imageNamed
método usado para vazar era melhor evitá-lo, mas foi corrigido em versões recentes. Gostaria de compreender melhor o algoritmo de cache para tomar uma decisão fundamentada sobre onde posso confiar no sistema para armazenar minhas imagens em cache e onde preciso ir mais longe e fazer isso sozinho. Meu atual entendimento básico é que é um simples NSMutableDictionary
de UIImages
referenciado pelo nome do arquivo. Ele fica maior e quando a memória se esgota fica muito menor.
Por exemplo, alguém sabe com certeza que o cache de imagem por trás imageNamed
não responde didReceiveMemoryWarning
? Parece improvável que a Apple não fizesse isso.
Se você tiver alguma ideia sobre o algoritmo de cache, poste aqui.
Respostas:
tldr: ImagedNamed está bem. Ele lida bem com a memória. Use-o e pare de se preocupar.
Editar novembro de 2012 : Observe que esta questão data do iOS 2.0! Os requisitos e o manuseio de imagens mudaram muito desde então. Retina torna as imagens maiores e carregá-las um pouco mais complexas. Com o suporte integrado para imagens de iPad e retina, você certamente deve usar ImageNamed em seu código. Agora, para o bem da posteridade:
O tópico irmão no Apple Dev Forums recebeu um tráfego melhor. Especificamente, Rincewind adicionou alguma autoridade.
enquanto avisa que
e
Então, aí está. imageNamed: não vai quebrar suas janelas ou matar seus filhos. É muito simples, mas é uma ferramenta de otimização. Infelizmente, ele é mal nomeado e não há equivalente que seja tão fácil de usar - portanto, as pessoas o abusam e ficam chateadas quando ele simplesmente faz seu trabalho
Eu adicionei uma categoria ao UIImage para corrigir isso:
Rincewind também incluiu alguns códigos de exemplo para construir sua própria versão otimizada. Não consigo ver que vale a pena a manutenção, mas aqui é para ser completo.
A desvantagem desse código é que a imagem decodificada usa mais memória, mas a renderização é mais rápida.
fonte
Na minha experiência, o cache de imagens criado por imageNamed não responde a avisos de memória. Tive dois aplicativos que eram tão enxutos quanto eu poderia chegar até o gerenciamento de mem, mas ainda estavam travando inexplicavelmente devido à falta de mem. Quando parei de usar imageNamed para carregar as imagens, os dois aplicativos se tornaram dramaticamente mais estáveis.
Admito que ambos os aplicativos carregaram imagens um tanto grandes, mas nada que fosse totalmente fora do comum. No primeiro aplicativo, eu simplesmente pulei o armazenamento em cache porque era improvável que um usuário voltasse para a mesma imagem duas vezes. No segundo, construí uma classe de cache realmente simples fazendo exatamente o que você mencionou - mantendo UIImages em um NSMutableDictionary e, em seguida, liberando seu conteúdo se recebesse um aviso de memória. Se imageNamed: fosse armazenado em cache assim, eu não deveria ter visto nenhuma atualização de desempenho. Tudo isso estava rodando no 2.2 - não sei se há alguma implicação no 3.0.
Você pode encontrar minha outra pergunta sobre esse problema no meu primeiro aplicativo aqui: StackOverflow question about UIImage cacheing
Uma outra observação - InterfaceBuilder usa imageNamed nos bastidores. Algo para ter em mente se você tiver esse problema.
fonte