我有一个奇怪的问题,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
答案 0 :(得分:1)
这看起来不像是可以解决的问题。
我建议提交一个错误,如果你不能做一个较小的测试用例,请附上整个项目。如果您不希望公开显示您的项目,则只能提交Xamarin员工可以访问的私有错误。
答案 1 :(得分:0)
您可以尝试显式声明变量
UINavigationController navController = myClass.NavController;
或者,我想知道这是否与需要等待调用UIViewController.ViewDidLoad方法有关,因为该类的内部可能尚未初始化?
在这里黑暗中拍摄,我想不出你的代码不起作用的原因。