Мы использовали Xamarin iOS в течение последних 8 месяцев и разработали нетривиальное корпоративное приложение со многими экранами, функциями, вложенными элементами управления. Мы сделали свою собственную арку MVVM, кросс-платформу BLL и DAL как "рекомендуется". Мы используем код между Android и даже наш BLL/DAL используется в нашем веб-продукте.
Все хорошо, только сейчас в стадии релиза проекта мы обнаруживаем непоправимые утечки памяти повсюду в приложении Xamarin iOS. Мы выполнили все "рекомендации", чтобы решить эту проблему, но реальность такова, что С# GC и Obj-C ARC кажутся несовместимыми механизмами сбора мусора в том виде, как они накладываются друг на друга в платформе monotouch.
Реальность, которую мы обнаружили, заключается в том, что возникают жесткие циклы между нативными объектами и управляемыми объектами WILL и ЧАСТО) для любого нетривиального приложения. Чрезвычайно просто, чтобы это произошло везде, где вы используете, например, lambdas или распознаватели жестов. Добавьте сложность MVVM и это почти гарантия. Мисс только одна из этих ситуаций и целые графики объектов никогда не будут собраны. Эти графики будут замаскировать другие объекты и расти как рак, что в конечном итоге приведет к быстрому и беспощадному истреблению со стороны iOS.
Ответ на Xamarin - это незаинтересованная отсрочка проблемы и нереалистичное ожидание того, что "разработчики должны избегать этих ситуаций". Тщательное рассмотрение этого показывает это как признание того, что Сбор мусора по существу разрушен в Xamarin.
Реализация для меня теперь заключается в том, что вы действительно не получаете "сбор мусора" в Xamarin iOS в традиционном смысле С#.NET. Вам нужно использовать шаблоны "утилизацию мусора", чтобы заставить GC двигаться и выполнять свою работу, и даже тогда это никогда не будет идеальным - НЕ ДЕТЕРМИНИСТИЧЕСКИМ.
Моя компания инвестировала удачу, пытаясь остановить наше приложение от сбоев и/или нехватки памяти. Мы в основном должны были явно и рекурсивно распоряжаться каждой чертовой штукой в поле зрения и внедрять утилизацию мусора в приложение, просто чтобы остановить аварии и иметь жизнеспособный продукт, который мы можем продать. Наши клиенты поддерживают и терпимы, но мы знаем, что это не может быть вечно. Мы надеемся, что у Xamarin есть специальная команда, работающая над этой проблемой и забившая ее раз и навсегда. Не похоже, к сожалению.
Вопрос в том, является ли наш опыт исключением или правилом для нетривиальных приложений корпоративного класса, написанных на Xamarin?
ОБНОВЛЕНИЕ
См. ответ для метода DisposeEx и решения.