2012-01-20 5 views
4

У меня есть приложение для iPad (IOS 4.3 & 5.0), которое создает UIView с не менее чем 2-мя поднаборами каждый раз, когда страницы пользователя перемещаются вперед или назад. 2 подпункта представляют собой объекты UIWebView.Утечка памяти UIWebView

При каждом соответствующем проглатывании старые UIWebViews удаляются и освобождаются должным образом (removeFromSuperview затем останавливает загрузку и устанавливает делегат в nil), а родительский UIView освобождается. Я могу подтвердить, что оба родительских UIView и 2 дочерних UIWebViews полностью исчезли.

Я могу видеть счетчик на веб-просмотрах, поскольку они удаляются, и я совершенно уверен, что они действительно удаляются каждый раз. Однако распределение памяти продолжает увеличиваться при каждом прохождении ~ 200-350k. Никаких утечек в инструменте, но я вижу, что использование памяти медленно растет. На iPad 1 приложение в конечном итоге (в течение 6-10 минут умеренного использования) получает несколько предупреждений памяти и прекращается. Сгенерирован журнал ошибок LowMemory ... и т. Д.

Мы используем stringByEvaluatingJavaScriptFromString и loadRequest для заполнения Webviews. Использование памяти увеличивается даже тогда, когда ничто не вводится или не загружается в webView.

Неужели кто-то испытывает такое поведение с помощью UIWebViews? Кто-нибудь справился с этим успешно?

Хоть, комментарии & ответы были бы весьма полезными.

+0

Вы удаляете из супервизора, прекращаете загрузку и устанавливаете делегат на нуль, но уверены ли вы, что у вас нет дополнительного сохранения в этих веб-просмотрах? Возможно, вы не учитываете '@property (nonatomic, keep)'? – Tim

+0

Привет, тебе повезло с этим бороться? –

+1

Циркуляр ссылка. Один из моих взглядов все еще висел на контроллере. Довольно классическая память, в конце концов, но сложная для работы в большой кодовой базе. – smaura777

ответ

0

Не известно о какой-либо утечке, но если вы уничтожаете и воссоздаете одну и ту же иерархию представлений каждый раз, почему бы не сохранить их и повторно использовать их?

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

+0

Это не вариант здесь, и да, я сделал это изначально, а выделение памяти по-прежнему увеличивалось при каждом прокрутке. – smaura777

+0

http://stackoverflow.com/a/5056158/990618 –

1

Попробуйте использовать Инструменты, но с шаблоном «Выделения» и посмотрите столбцы «# Living» для UIWebView. Я обычно использую его, как этот:

  1. Профиль приложения с шаблоном Отчисления
  2. «Предупреждать вверх» приложение, перейдя через все вкладки, прокручивать и т.д.
  3. Нажмите «Mark Heap», это создаст «Базовый» heapshot
  4. ли вещь вы думаете причины объекты остаться вокруг
  5. Нажмите «Mark Heap» снова, это будет создавать «Heapshop #» heapshot
  6. Осмотрите объекты в «Heapshop #», который будет показывать размер и количество созданных объектов и живой с момента последнего кучи.
  7. Goto 4
+0

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

+0

Итак, вы видите, что #living постоянно растет для многих объектов? –

0

вы все еще видите эту проблему? Я отследил то, что выглядит как неограниченном использование памяти (не обязательно утечки, но я получаю низкие предупреждения памяти и в конечном итоге прекращение процесса) по телефону stringByEvaluatingJavaScriptFromString снова и снова:

[webview stringByEvaluatingJavaScriptFromString:@"something()"]; 

Похоже, есть что-то странное там.

+0

Я использую этот метод много, и я тоже это вижу. К сожалению, я не могу заменить его чем-то другим. – smaura777

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