2011-12-13 55 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 

然後執行/你的程序崩潰和複製粘貼的輸出,在終端上,成錯誤報告(或將其添加爲附件)。