2

我正在尝试通过 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>

如何防止此错误发生?

4

2 回答 2

5

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

我们正在努力在使用 LINQ 时解决这些问题,因此我还建议使用可编译的测试用例提交错误,以便我们可以确保您的案例在未来正常工作。

于 2011-12-13T12:56:51.287 回答
3

您可能会遇到AOT 限制(例如这个,其中 AOT 编译器无法提前正确确定要编译的类型,以确保代码可以在运行时工作。

如何防止此错误发生?

解决方案取决于受到的确切限制。LINQ 查询会生成大量 IL 代码,因此开发人员(或 apt 编译器)并不总是清楚生成了什么。这使得解决这个问题变得更加困难。

要深入了解此类问题,我们需要相当多的信息,因此在http://bugzilla.xamarin.com上填写错误报告要好得多。例如

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

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

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

于 2011-12-13T12:57:06.180 回答