0

我有一个奇怪的问题,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
4

2 回答 2

1

这看起来不是可以在这里解决的问题。

如果您无法制作更小的测试用例,我建议您提交一个错误,并附上整个项目。如果您不希望您的项目公开可见,您可以提交只有 Xamarin 员工有权访问的私有错误。

于 2012-04-13T22:13:50.480 回答
0

你能尝试显式声明变量吗

UINavigationController navController = myClass.NavController;

或者,我想知道这是否与需要等待 UIViewController.ViewDidLoad 方法被调用有关,因为类的内部可能尚未初始化?

只是在这里在黑暗中拍摄,我想不出你的代码不起作用的原因。

于 2012-04-16T17:25:16.230 回答