Подтвердить что ты не робот

Утечка памяти при каждом выпуске UIScrollView

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




Изменить 1:

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

4b9b3361

Ответ 1

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

Ответ 2

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

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

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

Ответ 3

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

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

Ответ 4

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

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

//yourScrollView.m
-(void)handlePan:(id)sender{
   [yourDelegate yourProtocol];
}