отладка утечек памяти в приложении Monotouch - PullRequest
0 голосов
/ 20 июня 2011

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

foreach (UIView subv in targetView.Subviews) {
                foreach (UIView subsubv in subv.Subviews) {
                    subsubv.RemoveFromSuperview();
                    subsubv.Dispose();
                }   
                subv.RemoveFromSuperview();
                subv.Dispose();
            }

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

i) Разрушает ли monotouch UIView со всеми вложенными детьми автоматически?

ii) Инструменты не показывают утечек памяти, как лучше всего это отладить?

спасибо.

1 Ответ

3 голосов
/ 10 августа 2011

Если больше нет ссылок на ваш UIView, тогда он должен получить GC'd. Быстрый способ выяснить, был ли собран ваш объект, - создать класс, который наследует UIView (или любой другой используемый вами класс), а затем создать финализатор / деструктор для этого класса. В финализаторе сделаем консольную запись.

~MyView()
{
    Console.WriteLine("MyView: finalized");
}

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

...