Какие есть варианты для поиска исключений Monotouch, таких как «System.Exception: селектор, вызванный из target-c для управляемого объекта, который был GC'ed»? - PullRequest
4 голосов
/ 01 декабря 2011

Я получаю некоторые из этих исключений ниже.Какие у меня есть варианты, чтобы отследить эти проблемы?Я отчасти заблудился с ними, потому что они случаются спорадически и ТОЛЬКО на устройстве, но никогда в симуляторе.

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)
  at System.Activator.CreateInstance (System.Type type, BindingFlags bindingAttr, System.Reflection.Binder binder, System.Object[] args, System.Globalization.CultureInfo culture, System.Object[] activationAttributes) [0x00000] in <filename unknown>:0
  at System.Activator.CreateInstance (System.Type type, System.Object[] args, System.Object[] activationAttributes) [0x00000] in <filename unknown>:0
  at System.Activator.CreateInstance (System.Type type, System.Object[] args) [0x00000] in <filename unknown>:0
  at MonoTouch.ObjCRuntime.Runtime.ConstructNSObject (IntPtr ptr, IntPtr klass) [0x00000] in <filename unknown>:0
  --- End of inner exception stack trace ---
  at MonoTouch.ObjCRuntime.Runtime.ConstructNSObject (IntPtr ptr, IntPtr klass) [0x00000] in <filename unknown>:0
  at MonoTouch.ObjCRuntime.Runtime.GetNSObject (IntPtr ptr) [0x00000] in <filename unknown>:0
  at MonoTouch.ObjCRuntime.Runtime.GetNSObjectWrapped (IntPtr ptr) [0x00000] in <filename unknown>:0
  at (wrapper native-to-managed) MonoTouch.ObjCRuntime.Runtime:GetNSObjectWrapped (intptr)
  at MonoTouch.UIKit.UIApplication.Main (System.String[] args, System.String principalClassName, System.String delegateClassName) [0x00000] in <filename unknown>:0
  at Browser.Application.Main (System.String[] args) [0x00000] in .../Main.cs:15

Ответы [ 3 ]

4 голосов
/ 02 сентября 2012

Это не совсем связано с ситуацией OP, но я получил эту ошибку при загрузке представления с кончика, и оказалось, что я не правильно настроил конструктор класса представления:

public MyView() : base()
{
    // Wrong!
}

Вам необходимо включить параметр IntPtr:

public MyView(IntPtr handle) : base(handle)
{

}
2 голосов
/ 05 декабря 2011

На этот вопрос не существует ни одного простого ответа, но я могу поделиться способом помочь в их поиске:

Как сказал @Miguel, такое исключение означает, что среда выполнения пытается повторно вспомнить экземплярBrowser.FolderListController.Это означает, что один или несколько экземпляров Browser.FolderListController собираются даже в том случае, если они все еще понадобятся позже.

Ваш первый шаг должен состоять в проверке жизненного цикла каждого Browser.FolderListController экземпляров.,Например,

  • там, где они созданы;
  • там, где происходят вызовы;
  • , где вы Dispose их вручную - что может конфликтовать слюбой сохраняющий MonoTouch попробуйте сделать, чтобы помочь;
  • обнулить или удалить из коллекций (т.е. удалить ссылки) ...

Как только вы узнаете жизненный цикл, вы можете:

  • добавить финализатор к Browser.FolderListController и установить точку останова внутри него.Финализатор выполняется в отдельном потоке, поэтому он не скажет вам, где была удалена последняя ссылка - но он сообщит вам приблизительно когда (по крайней мере, до некоторого пункта);

  • добавить конструктор .ctor(IntPtr) и добавить в него точку останова.Опять же, он не даст вам точную точку (где это требуется), но сообщит вам приблизительно , когда (по крайней мере, до другой балл);

Запустите ваше приложение, получите сбой, а затем посмотрите, что происходит между этими двумя моментами времени (по сравнению с вашим жизненным циклом).

1 голос
/ 02 декабря 2011

Вышеуказанное означает, что объект был создан, передан в Objective-C для последующего хранения, а затем он был собран Mono, а затем снова передан Mono при обратном вызове или вызове какого-либо делегата.

Обычно это означает, что в нашем коде нам не удалось отловить случай, когда нам нужно было сохранить явную ссылку. Тестовый пример для этого был бы полезен, поскольку он помог бы нам исправить это в MonoTouch.

Мы также разработали новую методику для одновременного устранения всех этих проблем, но код не готов для публичного использования.

...