我可以选择什么来搜索Monotouch异常,比如;System.Exception:从objective-c对已被GC';埃德;?

我可以选择什么来搜索Monotouch异常,比如;System.Exception:从objective-c对已被GC';埃德;?,exception,garbage-collection,xamarin.ios,Exception,Garbage Collection,Xamarin.ios,下面是一些例外情况。我有什么办法来追踪这些问题?我有点迷茫,因为它们只是偶尔发生在设备上,而且只在模拟器上发生 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(Sy

下面是一些例外情况。我有什么办法来追踪这些问题?我有点迷茫,因为它们只是偶尔发生在设备上,而且只在模拟器上发生

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
System.Exception:在已GC'ed的托管对象上从objective-c调用选择器--->System.MissingMethodException:未找到Browser.FolderListController::.ctor(System.IntPtr)的构造函数
在System.Activator.CreateInstance(System.Type类型、BindingFlags bindingAttr、System.Reflection.Binder Binder、System.Object[]参数、System.Globalization.CultureInfo区域性、System.Object[]activationAttributes)[0x00000]中:0
在System.Activator.CreateInstance(System.Type类型,System.Object[]args,System.Object[]activationAttributes)[0x00000]中:0
在:0中的System.Activator.CreateInstance(System.Type类型,System.Object[]args)[0x00000]处
在MonoTouch.ObjCRuntime.Runtime.ConstructNSObject(IntPtr ptr,IntPtr klass)[0x00000]中:0
---内部异常堆栈跟踪的结束---
在MonoTouch.ObjCRuntime.Runtime.ConstructNSObject(IntPtr ptr,IntPtr klass)[0x00000]中:0
在:0中的MonoTouch.ObjCRuntime.Runtime.GetNSObject(IntPtr ptr)[0x00000]处
在:0中的MonoTouch.ObjCRuntime.Runtime.GetNSObjectWrapped(IntPtr ptr)[0x00000]处
at(包装器本机到托管)MonoTouch.ObjCRuntime.Runtime:GetNSObjectWrapped(intptr)
在:0中的MonoTouch.UIKit.UIApplication.Main(System.String[]args,System.String principalClassName,System.String delegateClassName)[0x00000]处
在…/Main.cs:15中的Browser.Application.Main(System.String[]args)[0x00000]处

上面的意思是创建了一个对象,并将其传递给Objective-C保留,然后由Mono进行垃圾收集,然后通过回调或某些委托调用将其重新呈现给Mono

这通常意味着在我们的代码中,我们无法捕捉到需要保留显式引用的情况。这方面的测试用例将非常有用,因为它将帮助我们在MonoTouch中解决这个问题


我们还开发了一种新技术,可以一次解决所有这些问题,但代码还没有准备好供公众使用。

没有一个简单的答案,但我可以分享一种方法来帮助解决这些问题:

如@Miguel所说,这样的异常意味着运行时正试图重新显示
Browser.FolderListController
的实例。这意味着正在收集
Browser.FolderListController
的一个或多个实例,即使以后仍然需要它们

第一步应该是查看每个
浏览器.FolderListController
实例的生命周期。例如

  • 它们是在哪里产生的
  • 呼叫发生的地点
  • 您可以手动处理它们,这可能与任何保留的MonoTouch试图帮助您的操作相冲突
  • 已从集合中删除空值(即删除引用)
了解生命周期后,您可以:

  • 将终结器添加到
    Browser.FolderListController
    并在其中设置断点。终结器是在一个单独的线程上执行的,因此它不会告诉您最后一个引用被删除的位置,但它会告诉您大约何时(至少不会在某个点之前)

  • 添加
    .ctor(IntPtr)
    构造函数并在其中添加断点。同样,它不会给你一个确切的点(在需要的地方),但它会告诉你大约什么时候(至少不是在另一点之前)


执行应用程序,获得崩溃,然后查看这两个时间点之间发生的情况(与生命周期相比)。

这与OP的情况并不完全相关,但我在从nib加载视图时遇到此错误,结果发现我没有正确设置视图类的构造函数:

public MyView() : base()
{
    // Wrong!
}
您需要包括IntPtr参数:

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

}

谢谢你,米格尔,我知道这是怎么发生的,但是你知道如何在我的案例中发现问题吗?我知道这是一个UITableViewCell I子类…我不能给你一个例子,因为它发生得太零散了。但是请告诉我:它不应该经常发生在模拟器mor中,因为GC是不断调用的吗?我只看到设备上的效果。我认为这是一个时间问题。该设备只是比模拟器慢…但我怎么能找出它的确切原因呢??哦,还有:你能告诉我你的“解决所有问题”方案的基本想法吗?只要一个提示就足够了。那么你知道我怎样才能解决这些问题吗?当然,它们从来不会发生在我身上……你可以通过添加一些
GC.Collect()来尝试更频繁地激发它周围,例如,在任何调用
Browser.FolderListController
之后,尝试与原始错误报告一样接近(例如,我假设发布版本)发布版本是否受GC问题的影响更大?不,但既然你说“当然不会发生在我身上…”,我假设这会发生在客户身上,它将使用发布版本。如果您在复制问题时遇到困难(相信我,我知道这感觉很好;-),那么您应该尽可能接近真实配置。这是在Mono中创建新的
UIViewController
并在情节提要中使用它时的解决方案。必须添加此构造函数来解决我的问题。谢谢