2011-12-13 19 views
2

我试图通过MonoTouch中的Debug | iPhone选项在iOS设备上运行我们的应用程序。然而,我们遇到问题的速度相当快。但下列情况除外使用LINQ在设备上单击JIT错误

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> 

我怎样才能防止这种错误的发生?

+0

究竟是哪种通用词典? –

+0

看我的第一篇文章。不得不编辑它,所以它会显示类型,因为在这里stackoverflow格式化。嘿:) – Kroan

回答

5

问题是价值类型作为字典中的键,如记录here。将字典更改为不具有值类型作为键可能会使此案例有效(不幸的是,在某些情况下,LINQ将自行使用字典,在这种情况下,将需要重新编写查询)。

我们正在努力解决这些问题,同时使用LINQ,所以我还建议filing a bug带有可编译的测试用例,这样我们就可以确保您的案例在未来有效。

+0

你好。我重写了代码以使用List而不是Dictionary,因为我可以通过其他方式检索标记。这解决了我的问题,并且LINQ代码现在可以正常工作。非常感谢! – Kroan

3

你很可能击中AOTlimitation(这样one),其中AOT编译器无法确定正确的各类编译,时间提前,以确保代码可以在运行时工作。

如何防止发生此错误?

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

为了深入了解这些问题,我们需要相当多的信息,所以填写一个错误报告,在http://bugzilla.xamarin.com上,要好得多。例如。

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

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

然后执行/你的程序崩溃和复制粘贴的输出,在终端上,成错误报告(或将其添加为附件)。