У меня есть приложение MonoTouch с UITabBarController, причем каждая из вкладок является UINavigationController. Некоторые из них оборачивают UIViewController, который добавляет UITableView и UIToolbar, а другие оборачивают DialogViewController.
До сих пор я не уделял много внимания управлению памятью/представлением (в основном я работал в симуляторе), но когда я начал тестировать на реальном устройстве, я заметил некоторые сбои из-за низкой производительности. состояния памяти (например, приложение завершается, и я обнаруживаю из своего журнала, что DidReceiveMemoryWarning был вызван до этого).В других случаях я замечаю длительные паузы в отклике приложения, которые, как я предполагаю, связаны с циклом GC.
До сих пор я предполагал, что каждый DialogViewController, который я помещаю в стек навигации, очищает свои представления и другие вещи, которые он выделяет, когда я извлекаю его. Но я начинаю понимать, что это, вероятно, не так просто, и что мне нужно начать вызывать Dispose() для вещей.
Существуют ли передовые методы управления ресурсами и памятью с помощью MonoTouch и MT.D? В частности:
Приношу извинения за общий характер этого вопроса - это кажется хорошей темой для технического документа, но я не смог найти...
Обновление: чтобы конкретизировать вопрос: после использования Instruments и профилировщик Xamarin Heapshot, мне ясно, что я пропускаю UIViewControllers, когда пользователь открывает стек навигации. Рольф подал ошибкудля этого, и у него есть два дубликата, так что это реальная проблема не только для меня. К сожалению, я не нашел хорошего обходного пути для просочившихся UIViewControllers — я не нашел подходящего места для вызова Dispose() на них. Естественным местом для освобождения ресурсов, выделенных ViewDidLoad, является сообщение ViewDidUnload, но оно никогда не вызывается в симуляторе, поэтому мой объем памяти продолжает расти. На устройстве я вижу DidReceiveMemoryWarning, но я не хочу использовать это как место для освобождения моего контроллера представления и его ресурсов, поскольку я не уверен, что iOS действительно выгрузит мое представление, и, следовательно, не гарантирует, что мой ViewDidLoad снова будет вызван либо (что привело к ViewDidAppear, который должен был бы защищаться от ситуаций, когда его основные ресурсы были удалены).Хотелось бы получить совет, как выбраться из этой заварухи...