我有一个奇怪的问题,MonoTouch 似乎要么没有编译方法,要么找不到它被指示调用的已编译方法,并且仅在发布配置中的设备上 - 调试版本很好。我尝试使用更简单的代码示例重现它,但没有成功,所以我怀疑您是否能够使用下面的代码看到行为。但这本质上就是我正在做的事情:
using System;
using MonoTouch.UIKit;
public class MyClass
{
private UINavigationController _navController;
private UIViewControler _viewController;
public UINavigationController NavController
{
get
{
if (_navController == null)
{
if (_viewController == null)
{
_viewController = new UIViewController();
}
_navController = new UINavigationController(_viewController);
}
return _navController;
}
}
}
然后,用其他方法...
public void SomeMethod()
{
MyClass myClass = new MyClass();
var navController = myClass.NavController; // <-- This is where it throws
}
我得到的例外是标准的 JIT 编译消息,说它试图 JIT get_NavController()。我觉得这很奇怪,因为没有虚拟泛型,没有 LINQ,链接器已关闭,而且似乎没有其他任何通常会导致 JIT 的问题。我还验证了它会抛出 MyClass 上定义的其他方法和属性,但不会抛出构造函数或System.Object
继承的方法。反射显示,myClass.GetType().GetMembers()
对于我所期望的一切,都有一个 MemberInfo。然而,仅对于 Release|iPhone,我无法访问这些方法或属性。我能得出的唯一合乎逻辑的结论是 aot 编译步骤缺少它们,我根本不知道为什么会发生这种情况,更不用说仅在 Release 配置中。
我的问题是,什么可能导致这种情况,以及修复它的下一步是什么?我什至不知道从哪里开始调试这个,或者提交一个关于什么的错误,因为我无法在我们(很多)更大的项目的上下文中重现它。
更新:请求了确切的异常文本。
System.ExecutionException: Attempting to JIT compile method
'MyNamespace.MyClass.get_NavController ()' while running with --aot-only