Сбой приложения Monotouch без StackTrace или журналов (деструктор никогда не вызывался)

Мое приложение MonoTouch продолжает падать, и я не знаю, что делать. На данный момент я чувствую, что перепробовал все. У меня есть RootViewController, который переходит на бесконечное количество vewcontrollers. Каждый раз, когда происходит переход, я вручную вызываю dispose на предыдущем ViewController и отображаю новый.

Для меня это похоже на утечку памяти, так как приложение вылетает примерно на 20-40 ViewController и определенно становится более вялым перед началом работы.

  1. Как просмотреть использование памяти моим приложением MonoTouch на устройстве? (Не вылетает в симуляторе)

  2. Есть ли еще диагностические способы выяснить, почему он падает?

Любая помощь будет признательна.

ОБНОВЛЕНИЕ Я добавил следующее в свой VC.

~TargetPromptController(){
    Console.WriteLine("TargetPromptController Released from memory!");
 }

И никогда не звонят.


person Chris Kooken    schedule 12.03.2011    source источник


Ответы (2)


Класс C# GC может дать вам представление об общем объеме используемой памяти, но он очень неточен и в основном неверен. Однако он может сказать вам, увеличивается ли использование памяти, уменьшается или стабилизируется. Как правило, при использовании GC.Collect у меня было больше проблем, чем без него. Поэтому мое общее предложение — не использовать этот метод.

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

Ваша проблема, вероятно, в том, что Monotouch сохраняет ViewController в памяти, несмотря на ваш вызов Dispose. Создайте свойство типа List и сохраните там свои VC. Это может упростить для MonoTouch обнаружение и сбор неиспользуемых VC. Кроме того, удалите как можно больше содержимого VC, прежде чем выпускать его из коллекции. Я видел, как Monotouch хранит ссылки на дочерние объекты, родительский объект которых я удалил.

В общем, Monotouch не является зрелым продуктом, и вам придется привыкнуть обращаться к их службе поддержки. И пожалуйста, опубликуйте свое решение здесь, чтобы мы все могли учиться! :)

person Simeon    schedule 12.03.2011

Обязательно избавляйтесь от ненужных объектов. Несмотря на то, что mono touch делает часть этого за вас, я считаю, что лучше сделать это в моем коде. Всегда принудительно выполняйте сборку мусора во время обширных подпрограмм в циклах, где код генерирует много одноразовых объектов. P.S. Я бы не назвал Monotouch незрелым. Платформа рулит!

person Keith Aymar    schedule 22.12.2011