Pergunta

Para citar o doc CGLayer:

Quartz armazena quaisquer objetos que são reutilizados, incluindo CGLayer objetos.

Estou tendo problemas com a memória de páginas grandes e estou tentando implementar um mecanismo simples onde as vistas são liberados e recriado com base em se eles estão on / off tela.

Say por uma questão de simplicidade que eu tenho um monte de UIImages, criado como resultado de uma solicitação de rede, salvo em um algum lugar matriz. Eu criar um UIImageView assim:

anImage = [anArray objectAtIndex:0];
UIImageView* imgView = [[UIImageView alloc] initWithImage:anImage];
[mainView addSubview:imgView]; // Quartz eats memory for view after first draw
[imgView release];             // owned by mainView now
[...]                          // wait a bit for draw cycle
[imgView removeFromSuperview]; // memory doesn't go down

Quando o imgView vai fora da tela é removedFromSuperview e liberado. Belas certo? Nope- o CGLayer que existe em Quartz não é removido, porque anImage ainda existe.

Como posso resolver isso? A única maneira neste cenário é criar uma imagem exatamente o mesmo pelas costas de quartzo com um endereço de ponteiro diferente e apagar a imagem antiga. E a única maneira de fazer isso é 'cópia profunda' a imagem (não UIImage não implementar NSCoding) ou para pedir-lo novamente através da rede (lenta).

O que eu estou pensando é que eu preciso SqlLite minhas imagens para um banco de dados e refetch-los cada vez que um ponto de vista vem onscreen- mas eu gostaria de ouvir os pensamentos das pessoas sobre este assunto.

Foi útil?

Solução

Aqui você imgView incremento de 0 a 1.

UIImageView* imgView = [[UIImageView alloc] initWithImage:anImage];

Na linha seguinte, o MAINVIEW incrementes a contagem de referência. (Agora é 2)

[mainView addSubview:imgView]; // Quartz eats memory for view after first draw

Aqui, você liberar o imgView ea contagem de referência vai para trás para baixo a um.

[imgView release]; // owned by mainView now

Eu não acho que seus problemas de memória têm nada a ver com ANIMAGE. Enquanto imgView é um subexibição, não irá liberar o objeto, porque ele precisa desse objeto para desenhar na tela.

O que os seguintes meios de linha, é que se você desenhar programaticamente para o seu CGLayer, Quartz com o cache que você tenha desenhado, de modo que você não está constantemente a redesenhar a mesma coisa. Não é realmente relacionado com a adição de subviews.

Quartz armazena quaisquer objetos que são reutilizados, incluindo CGLayer objetos.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top