2011-01-12 7 views
2

In einer UIScrollViewDelegate Klasse auf iOS 4.2.1 in meinem iPad App, die -scrollViewDidEndDecelerating: Methode eine andere Methode aufruft, tut dies:Warum ist `- [UILabel setText:]` Leak?

EntryModel *entry = [entries objectAtIndex:index]; 
self.titleLabel.text = entry.title; 

title ein nonatomic ist, behielt NSString Eigentum von EntryModel. titleLabel ist eine nicht-atomare, beibehaltene Eigenschaft mit einem IBOutlet, das sie mit einem in einer Nib definierten UILabel verbindet. Nach dem Bbum blog post habe ich die Heapshot-Analyse verwendet und den obigen Code als ein Leck identifiziert. Fast jedes Mal, wenn ich auf eine neue Seite blättern, leckt titleLabel ein bisschen:

alt text

Wenn ich das zweite Linie zu ändern:

self.titleLabel.text = @"Whatever"; 

Die undichte Stellen:

alt text

Ich bin verwirrt. Gibt -[UILabel text] keine alten Werte frei, bevor neue Werte zugewiesen werden? Ich gehe nicht davon aus, dass ich etwas falsch machen muss. Warum ist dieses Leck?

Antwort

0

Da Sie Heapshot-Generationen mit Nullzuweisungen haben, handelt es sich nicht um eine konsistente Zunahme des Speichers. Es könnte Caching sein oder es könnte ein Leck im Zusammenhang mit dem Scrollen sein, etwas, das durch die Risse in den Ereignissen fällt.

Was zeigen die Heapshot-Iterationen mit Zuweisungen in ihnen?

+0

Eine ganze Menge Zeug. CGPaths, '' s mit allerlei Zeug in ihnen. – theory

+0

könnte Cache-Akkretion sein. könnte ein echtes Leck sein. füge einen Fehler ein. – bbum

1

Vielleicht verlieren Sie nicht wirklich Speicher. Sie sind Zuordnung von Speicher, da die Texteigenschaft auf einem UILabel Kopie Semantik verwendet. Wenn Sie also self.titleLabel.text aufrufen, wird auf der rechten Seite der Zuweisung eine Kopie von NSString erstellt. Versuchen Sie, mit dem Leaks-Instrument zu laufen, um zu sehen, ob Sie Speicher verlieren.

+0

Lecks sieht dies nicht als ein Leck, aber es ist eindeutig. Ich verstehe, dass 'titleLable.text' eine Kopie des NSString bei der Zuweisung erstellt; aber warum gibt er es nicht frei, wenn ihm ein neuer Wert zugewiesen (und kopiert) wird? – theory

+0

Wenn Leaks es nicht als Leck sieht, warum denken Sie, dass es ein Leck ist? Wenn 'titleLable.text' die Zeichenfolge nicht korrekt freigegeben hat, würde Leaks es als ein Leck bezeichnen. – pwc

+0

Lecks würden es kein Leck nennen, wenn die Adresse noch erreichbar ist. Dass es noch erreichbar ist, bedeutet nicht, dass es nicht auch ein Leck ist; Verlassene Speicher ist ein großes Problem (Dinge wie Schreib-Caches und dergleichen). Siehe: http://www.friday.com/bbum/2010/10/17/when-is-a-leak-not-a-leak-using-heatshot-analysis-for-find-unerwünschte-memory-growth/ – bbum