MonoTouch использует большую память

#memory-leaks #xamarin.ios

#утечки памяти #xamarin.ios

Вопрос:

У меня есть monodevelop 2.8 поверх monotouch 5 и Xcode 4.2 SDK. У меня возникли проблемы с памятью в моем приложении для iPhone. Я изо всех сил пытался определить причину, поэтому я создал тестовое приложение с основным подробным представлением. Я внес незначительные изменения в rootcontroller, чтобы он отображал 5 корневых элементов вместо 1 по умолчанию. Каждый щелчок по корневому элементу добавляет новый DetailViewController в контроллер навигации.

 controller.NavigationController.PushViewController (DetailViewController, true);
 

В моем контроллере подробного просмотра я добавил логику, которая просто принимает входные данные, определяющие количество раз, когда происходит цикл, а затем кнопку для запуска цикла и выполнения вызова службы на основе REST. Очень минимальные изменения кода по сравнению со значением по умолчанию.

Просто запустив пример и посмотрев на него в инструментах, я, кажется, занимаю до 1,2 МБ живых байтов. Я думаю, что запустите подробный просмотр, коснувшись элементов в контроллере корневого представления, и я получу более 2 МБ. При повороте дисплея или открытии клавиатуры объем памяти увеличивается примерно на 3 МБ. Я возвращаюсь в контроллер и открываю другой вид из rootviewcontroller, и я вижу, что объем памяти еще немного увеличивается. Просто перемещаясь в представлениях и из них, даже не запуская свой пользовательский код, я могу использовать память в инструментах более 3 МБ. Раньше я видел, как мое приложение получало предупреждения о превышении объема памяти более чем на 3 МБ. Мое представление подробных данных теста очень простое: текстовое поле, метка и кнопка, на которых есть все выходы. У меня сложилось впечатление, что мне не нужно делать ничего особенного, чтобы их очистить. Однако я не вижу, чтобы в инструментах выпадали текущие байты.

В качестве дополнительного теста я добавил кнопку «Готово». Когда нажата кнопка «Готово», я иду и использую removeFromSuperview() на каждом выходе, Dispose() , а затем устанавливаю для него значение null. Я вижу, что текущие байты выпадают. Но это ничего не делает для меня, если вместо этого используется обратная навигация.

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

Ответ №1:

Сложно комментировать, не видя кода тестового приложения. Есть ли какой-либо способ отправить отчет об ошибке в http://bugzilla.xamarin.com и приложите свой тестовый проект?

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

Мне также было бы очень интересно ознакомиться с вашим тестовым примером.