在带有LINQ的设备上出现Monotouch JIT错误



我试图通过MonoTouch中的Debug|iPhone选项在iOS设备上运行我们的应用程序。然而,我们很快就遇到了一个问题。应用程序崩溃,出现以下异常

Attempting to JIT compile method "System.Linq.Enumerable:<FirstOfDefault`1>m_13<int> (int)" while running with aot-only.

现在我明白这个问题来自于JIT的通用部分,这在实际的iOS设备上是不允许的。但我不知道如何修复它。

下面是它崩溃的代码:
int nextTag = (from tag in _cellControllers.Keys
    where tag > currentTag
    select tag).FirstOrDefault();

_cellControllers是一个

Dictionary <int, UITableViewSource>

如何防止这个错误的发生?

问题是将值类型作为字典中的键,如下所述。将字典更改为不使用值类型作为键可能会使这种情况有效(不幸的是,在某些情况下,LINQ将自己使用字典,在这种情况下,它将需要重写查询)。

我们正在努力修复这些问题,同时使用LINQ,所以我也建议提交一个bug与一个可编译的测试用例,这样我们可以确保你的案例在未来的工作。

您可能遇到了AOT限制(就像这个),AOT编译器无法提前正确地确定要编译的类型,以确保代码可以在运行时工作。

如何防止这个错误的发生?

解决方案取决于被击中的确切限制。LINQ查询会生成大量的IL代码,所以对于开发人员(或apt编译器)来说,生成的代码并不总是显而易见的。这使得解决这个问题有点困难。

为了找到这些问题的根源,我们需要大量的信息,所以在http://bugzilla.xamarin.com上填写一个bug报告会更好。例如

最重要的部分是设备日志,您可以通过在终端窗口中运行以下命令获得:

/Developer/MonoTouch/usr/bin/mtouch --logdev

然后执行/崩溃您的应用程序,并将输出复制粘贴到终端上的bug报告中(或将其作为附件添加)。

最新更新