Frage

Ein Zitat aus dem CGLayer doc:

  

Quarz-Caches alle Objekte, die wiederverwendet werden, einschließlich CGLayer Objekte.

ich Probleme auf großen Seiten mit Gedächtnis habe und ich versuche, einen einfachen Mechanismus zu implementieren, wo Ansichten freigegeben werden und neu erstellt, basierend auf, ob sie Ein- / Aus-Bildschirm.

Sprich aus Gründen der Einfachheit, die ich ein paar UIImages habe, wie das Ergebnis einer Netzwerkanforderung erstellt, irgendwo in einem Array gespeichert. Ich erstelle ein UIImageView etwa so:

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

Wenn die imgView geht Offscreen es removedFromSuperview und freigegeben ist. Feine richtig? Nope- die CGLayer, die in Quarz besteht nicht entfernt wird, weil anImage noch existiert.

Wie kann ich dieses Problem umgehen? Der einzige Weg, in diesem Szenario ist ein Bild genau gleich hinter Quarz Rücken mit einer anderen Zeigeradresse und löscht das alte Bild zu erstellen. Und der einzige Weg, dies zu tun ist, um ‚tiefere Kopie‘ das Bild (UIImage nicht implementiert NSCoding) oder danach fragt wieder über das Netzwerk (langsam).

Was ich denke ist, dass ich meine Bilder in einer Datenbank SQLLite und sie jedes Mal eine Ansicht onscreen- kommt wieder beschaffen, aber ich würde gerne die Gedanken der Menschen auf das hören.

War es hilfreich?

Lösung

Hier erhöhen Sie imgView von 0 bis 1.

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

In der nächsten Zeile incrementes die Hauptansicht der Referenzzähler. (Jetzt ist es 2)

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

Hier geben Sie den imgView und der Referenzzähler geht zurück bis auf eine.

[imgView release]; // owned by mainView now

Ich glaube nicht, Ihre Speicherprobleme etwas mit Animage zu tun haben. Solange imgView ein Subview ist, wird es nicht um das Objekt freizugeben, weil es das Objekt muss auf den Bildschirm zeichnen.

Was die folgende Zeile bedeutet, dass, wenn Sie programmatisch mit Cache zu Ihrem CGLayer, Quarz zeichnen, was Sie gezeichnet haben, so dass Sie nicht ständig die gleiche Sache neu gezeichnet werden. Es ist nicht wirklich in Bezug auf das Hinzufügen Subviews.

  

Quarz-Caches alle Objekte, die wiederverwendet werden, einschließlich CGLayer Objekte.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top