Это как-то связано с другим вопросом, который я написал: Какие есть варианты для поиска исключений Monotouch, таких как «System.Exception: селектор, вызываемый из target-c для управляемого объекта, который был GC'ed»? .
Я получаю отчеты о сбоях от своих тестеров, и почти для всех моих контроллеров UIViewController я получаю сообщения об ошибках:
System.Exception: Selector invoked from objective-c on a managed object that has been GC'ed ---> System.MissingMethodException: No constructor found for Browser.FolderListController::.ctor(System.IntPtr)
Я не знаю, что я делаю что-то явно неправильно, и я не могу отследить проблемы, но я знаю, что ни в одном из случаев я не переопределяю конструктор IntPtr . Вопрос в том, должен ли я это реализовать? Это заставит проблемы уйти? Каковы будут последствия, если ObjC возродит контроллер GC с помощью этого конструктора?
EDIT:
Я нашел, по крайней мере, одну причину проблем, следуя советам Рольфа и Пупуса, и установил поток, который собирал 10 раз в секунду, чтобы я мог вызвать сбой.
Я активно использую NSNotificationCenter . Я регистрирую своих наблюдателей в ViewDidLoad()
и отменяю регистрацию в ViewDidUnload()
.
Однако код, который выполняется, если приходит уведомление manipulates the controller's view
.
Это означает, что есть вероятность, что обработчик сработает ПОСЛЕ ViewDidDisappear()
. И если представление уже получено с помощью GC, оно будет аварийно завершено.
Я исправил это, переместив свою подписку в NSNOtificatioCenter в ViewWillAppear()
и ViewWillDisappear()
.