Domanda

Per citare dal documento CGLayer:

  

Il quarzo memorizza nella cache tutti gli oggetti riutilizzati, inclusi gli oggetti CGLayer.

Sto riscontrando problemi con la memoria su pagine di grandi dimensioni e sto cercando di implementare un semplice meccanismo in cui le visualizzazioni vengono rilasciate e ricreate in base al fatto che siano on / off sullo schermo.

Supponiamo per semplicità che ho un sacco di UIImages, creati come risultato di una richiesta di rete, salvati in un array da qualche parte. Creo un UIImageView in questo modo:

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 imgView esce dallo schermo viene rimossoFromSuperview e rilasciato. Va bene vero? No, il CGLayer esistente in Quartz non viene rimosso, poiché anImage esiste ancora.

Come posso aggirare questo? L'unico modo in questo scenario è quello di creare un'immagine esattamente la stessa alle spalle di Quartz con un indirizzo di puntatore diverso ed eliminare la vecchia immagine. E l'unico modo per farlo è "copiare in profondità" l'immagine (UIImage non implementa NSCoding) o richiederlo di nuovo sulla rete (lento).

Quello che sto pensando è che ho bisogno di sqllite le mie immagini in un database e recuperarle ogni volta che una vista viene visualizzata sullo schermo, ma mi piacerebbe sentire i pensieri delle persone su questo.

È stato utile?

Soluzione

Qui aumenti imgView da 0 a 1.

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

Nella riga successiva, mainView incrementa il conteggio dei riferimenti. (ora sono 2)

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

Qui, rilasci imgView e il conteggio dei riferimenti torna indietro a uno.

[imgView release]; // owned by mainView now

Non credo che i tuoi problemi di memoria abbiano a che fare con un'immagine. Fintanto che imgView è una sottoview, non libererà quell'oggetto, perché ha bisogno di quell'oggetto per disegnare sullo schermo.

Ciò che significa la seguente riga è che se disegni a livello di codice al tuo CGLayer, Quartz con cache è ciò che hai disegnato, in modo da non ridisegnare costantemente la stessa cosa. Non è in realtà correlato all'aggiunta di visualizzazioni secondarie.

  

Il quarzo memorizza nella cache tutti gli oggetti riutilizzati, inclusi gli oggetti CGLayer.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top