2011-01-12 3 views
2

В классе UIScrollViewDelegate на прошивке 4.2.1 в моем IPad приложении, метод -scrollViewDidEndDecelerating: вызывает другой метод, который делает это:Почему `- [UILabel setText:]` Утечка?

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

title является неатомическим, сохранил NSString свойства EntryModel. titleLabel является неатомным сохраняемым свойством с IBOutlet, соединяющим его с UILabel, определенным в наконечнике. Следуя bbum's blog post, я использовал анализ Heapshot и идентифицировал вышеуказанный код как утечку. Почти каждый раз, когда я прокручиваю на новую страницу, titleLabel просачивается немного:

alt text

Если я изменяю, что вторая линия:

self.titleLabel.text = @"Whatever"; 

Утечка прекращается:

alt text

Я в замешательстве. -[UILabel text] не высвобождает старые значения перед назначением новых значений? Я предполагаю, что я должен делать что-то неправильно. Почему эта утечка?

ответ

0

Учитывая, что у вас есть генераторы с нулевым распределением, это не последовательное наращивание памяти. Это может быть кэширование [пошло не так], или это может быть утечка, связанная с прокруткой, что-то проваливается через трещины в событиях.

Что показывают итерации с помощью кучи с распределением в них?

+0

Довольно много вещей. CGPaths, '' s со всеми видами вещей в них. – theory

+0

может быть кеш-аккреция. может стать настоящей утечкой. файл ошибка. – bbum

1

Возможно, вы на самом деле не проливаете память. Вы : выделяете память, так как свойство text в UILabel использует семантику копирования. Таким образом, вызов self.titleLabel.text создаст копию NSString в правой части задания. Попробуйте запустить с помощью инструмента «Утечки», чтобы проверить, не утечка памяти.

+0

Утечки не видят в этом утечки, но это ясно. Я понимаю, что 'titleLable.text' создаст копию NSString при назначении; но почему он не освобождает его, когда ему присваивается новое значение (и копируется)? – theory

+0

Если утечка не видит утечки, почему вы думаете, что это утечка? Если 'titleLable.text' не выпустил строку правильно, утечки назвали бы ее утечкой. – pwc

+0

Утечки не будут называть это утечкой, если адрес еще доступен. То, что это все еще доступно, не означает, что это также не утечка; заброшенная память - это огромная проблема (такие вещи, как кеши только для записи и т. п.). См .: http://www.friday.com/bbum/2010/10/17/when-is-a-leak-not-a-leak-using-heapshot-analysis-to-find-undesirable-memory-growth/ – bbum

Смежные вопросы