我目前有一些代码,如下所示,使用Linq为我组织一些IEnumerables。在发布模式(iOS 5.0.1,MonoTouch 5.0.1,Mono 2.10.6.1)上在设备上执行此代码时,我得到异常
在使用--aot-only运行时尝试JIT编译方法'System.Linq.OrderedEnumerable`1:GetEnumerator()'。
生成此错误的代码是
// List<IncidentDocument> documents is passed in
List<LibraryTableViewItemGroup> groups = new List<LibraryTableViewItemGroup>();
List<DocumentObjectType> categories = documents.Select(d=>d.Type).Distinct().OrderBy(s=>s.ToString()).ToList();
foreach(DocumentObjectType cat in categories)
{
List<IncidentDocument> catDocs = documents.Where(d => d.Type == cat).OrderBy(d => d.Name).ToList();
List<LibraryTableViewItem> catDocsTableItems = catDocs.ConvertAll(d => { return new LibraryTableViewItem{ Image = GetImageForDocument(d.Type), Title = d.Name, SubTitle = d.Description}; });
LibraryTableViewItemGroup catGroup = new LibraryTableViewItemGroup{ Name = GetCatName(cat), Footer = null, Items = catDocsTableItems };
groups.Add (catGroup);
}
在Release | Debug配置的模拟器中或在Debug配置的设备上不会发生此错误。我在SO here和here上看过几个类似的主题,但我不确定我是否理解他们在这个问题上如何适用于我。
答案 0 :(得分:3)
这可能是一些事情。
使用完整 AOT构建iOS应用程序时有一些limitations,即确保在运行时不会有任何JIT(Apple限制)。即使消息看起来相同,每一个都是不同的(即许多原因会导致这种情况)。但是,我们可以为他们提供一些简单的解决方法;
它也可能是5.0.1中的(已知)回归(在5.0.2中已修复)。这产生了一些额外的AOT故障,这些故障通常不是问题(或已经解决的问题)。
我建议您更新到MonoTouch 5.0.2以查看它是否正确编译了您的应用程序。如果没有,请填写关于http; // bugzilla.xamarin.com的错误报告,并包含一个小的,自包含的测试用例来复制问题(上述内容不够完整)。如果启用调试时,它似乎是一个有趣的测试用例。