Утечка памяти при каждом выпуске UIScrollView - PullRequest
18 голосов
/ 19 марта 2012

В моем приложении у меня есть вид прокрутки и четыре вида таблицы. Каждый раз, когда один перетаскивается, а затем освобождается, я получаю утечку в 48 байт. Это действительно складывает. Как видите, обе группы утечек имеют один и тот же источник. Кто-нибудь видел подобную утечку раньше?




Редактировать 1:

Когда я нажимаю на стрелку рядом с утечкой, я получаю эту информацию для утечки:

Ответы [ 4 ]

28 голосов
/ 06 апреля 2012

То, что вы видите, является известной ошибкой в ​​iOS 5.1 и обсуждается на форумах разработчиков iOS как таковых.Вы можете найти соответствующую тему, выполнив поиск по форуму для "strdup".Смотрите тему под названием "Утечка памяти в приложении".Поиск сообщения от сотрудника Apple.

0 голосов
/ 21 апреля 2012

Обходной путь: я обнаружил, что утечка памяти произошла в handlePan: если установлен делегат UIScrollView. Мне были нужны методы делегата, поэтому я создал подкласс UIScrollView и объявил свой собственный @protocol. Затем я переопределил целевой селектор для scrollView panGestureRecognizer, не отправляя его в super:

//yourScrollView.h
@protocol yourScrollViewDelegate
-(void)yourProtocol;
@end

//yourScrollView.m
-(void)handlePan:(id)sender{
   [yourDelegate yourProtocol];
}
0 голосов
/ 18 апреля 2012

Обходной путь:

Я понял, что каким-то образом эти просочившиеся байты хранятся в просмотре прокрутки. Вы должны освободить свой scrollview и распределять его время от времени, сохраняя его состояние. Способ, которым вы определяете, когда вам следует перезагрузить скроллвью, зависит от вас, зависит от потребностей вашего приложения. Каждый раз, когда вы выпускаете представление прокрутки, эти байты также освобождаются.

0 голосов
/ 19 марта 2012

Скорее всего, это ваша вина, как-то.

В инструменте Allocations нажмите кнопку «i» и включите «Record Reference Counts». Затем инструменты могут показать вам все события выделения, сохранения, автоматического выпуска и выпуска, которые произошли с этими объектами. (Вы должны увидеть стрелку рядом с каждым просочившимся элементом - щелкните по нему, чтобы отобразить историю выделения этого объекта.)

Я думаю, вы обнаружите, что часть вашего кода что-то сохраняет или косвенно заставляет его сохранять. Вероятно, представление прокрутки или один из его распознавателей жестов, как предположение.

...