Мы обнаружили, что иногда разработчики сталкиваются со странными проблемами, например, диалоговые окна иногда остаются на экране, а иногда они исчезают, не оставляя следов и не объясняя, почему это произошло.
Обычно это происходит, когдавы создали UIAlertView и не сохранили ссылки на него, так как MonoTouch относился к этому объекту как к мусору (вы не ссылались на него из своего кода, поэтому у вас его не было).
Но то, как диалоговое окно исчезло с вашего экрана немедленно или позже, зависело от того, определила ли эвристика сборщика мусора, что пришло время запустить сбор.Если бы вы создали диалог сразу после коллекции, скорее всего, ваш диалог остался бы на экране.Но если вы были очень близки к коллекции, или если у вас был фоновый процесс, потребляющий память, GC сработал бы.
В общем, это сбивало с толку пользователей, "почему вещи исчезают случайно".Ответ был следующим: если вы не сохранили ссылку на него, сборщик мусора предположил, что вам все равно.
Чтобы сделать это более понятным для наших пользователей, при запуске MonoTouch в режиме отладки на симуляторе (и естьопция командной строки для управления этим для любых сборок), мы добавили поток на симуляторе, который непрерывно вызывает GC.Collect () каждые несколько секунд.Это делает более очевидным, что вы, возможно, не сохранили ссылку на ваш диалог.
Позже мы обнаружили, что очень полезным и распространенным шаблоном было держать вокруг себя два типа диалоговых окон, которые действительно имеютне использовать кроме их побочных эффектов: UIAlertView и UIActionSheet.Мы изменили MonoTouch так, чтобы он внутренне сохранял ссылки на эти два до тех пор, пока они не были отклонены.
Итак, мы получили лучшее из обоих миров: во время цикла разработки вы ловите ранее отсутствующие ссылки на нужные вам объекты, и мы взяли на себязаботиться о двух наиболее распространенных случаях, которые полезны только для их побочных эффектов.