【问题标题】:MonoTouch.Dialog crashMonoTouch.Dialog 崩溃
【发布时间】:2012-03-04 09:46:06
【问题描述】:

我有一个小型测试应用程序,它只在 3 页之间循环。 这是 AppDelegate:

    public override bool FinishedLaunching (UIApplication app, NSDictionary options)
    {
        _session = new Session();
        _session.NextScreen += (screenIndex) => 
        {
            window.RootViewController = _viewControllers[screenIndex];
        };

        _viewControllers.Add(new Screen0(_session));
        _viewControllers.Add(new Screen1(_session));
        _viewControllers.Add(new Screen2(_session));

        // create a new window instance based on the screen size
        window = new UIWindow (UIScreen.MainScreen.Bounds);

        // If you have defined a view, add it here:
        // window.AddSubview (navigationController.View);
        window.RootViewController = _viewControllers[0];

        // make the window visible
        window.MakeKeyAndVisible ();

        return true;

如果我在每个屏幕上放一个按钮,我就可以从一个页面导航到另一个页面,即

    public override void ViewDidLoad ()
    {
        base.ViewDidLoad ();

        UIButton button = new UIButton(new RectangleF(30, 200, 80, 34));
        button.SetTitle("Go to 1", UIControlState.Normal);
        button.TouchUpInside += (sender, e) => 
        {
            _session.ExittingScreen = 0;
        };
        View.AddSubview(button);
    }

但是,当我使用 MonoTouch.Dialog 时,我会遇到间歇性崩溃。这是我的代码:

    public override void ViewDidLoad ()
    {
        base.ViewDidLoad ();

        var rootElement = new RootElement("Register")
        {
            new Section()
            {
                new EntryElement("First Name", "required", ""),
                new EntryElement("Last Name", "required", ""),
                new EntryElement("Email Address", "required", ""),
                new EntryElement("Password", "required", "")
            },
            new Section()
            {
                new StyledStringElement("Submit you information", () => { _session.ExittingScreen = 1; })
            }
        };
        var dialogViewController = new DialogViewController(rootElement);
        var navigationController = new UINavigationController(dialogViewController);

        View.Add (navigationController.View);

和转储:

at (wrapper managed-to-native) MonoTouch.UIKit.UIApplication.UIApplicationMain (int,string[],intptr,intptr) 在 MonoTouch.UIKit.UIApplication.Main (string[],string,string) 在 MTD.Application.Main (string[]) at (wrapper runtime-invoke) .runtime_invoke_void_object (object,intptr,intptr,intptr)

本机堆栈跟踪:

0   MTD                                 0x00090b7c mono_handle_native_sigsegv + 284
1   MTD                                 0x00005f28 mono_sigsegv_signal_handler + 248
2   libsystem_c.dylib                   0x97da559b _sigtramp + 43
3   ???                                 0xffffffff 0x0 + 4294967295
4   UIKit                               0x02220952 -[UITableView _userSelectRowAtPendingSelectionIndexPath:] + 201
5   Foundation                          0x0173786d __NSFireDelayedPerform + 389
6   CoreFoundation                      0x01195966 __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ + 22
7   CoreFoundation                      0x01195407 __CFRunLoopDoTimer + 551
8   CoreFoundation                      0x010f87c0 __CFRunLoopRun + 1888
9   CoreFoundation                      0x010f7db4 CFRunLoopRunSpecific + 212
10  CoreFoundation                      0x010f7ccb CFRunLoopRunInMode + 123
11  GraphicsServices                    0x04789879 GSEventRunModal + 207
12  GraphicsServices                    0x0478993e GSEventRun + 114
13  UIKit                               0x02190a9b UIApplicationMain + 1175
14  ???                                 0x09ff6774 0x0 + 167733108
15  ???                                 0x09ff5958 0x0 + 167729496
16  ???                                 0x09ff57f0 0x0 + 167729136
17  ???                                 0x09ff587f 0x0 + 167729279
18  MTD                                 0x0000a292 mono_jit_runtime_invoke + 722
19  MTD                                 0x0016a17e mono_runtime_invoke + 126
20  MTD                                 0x0016e264 mono_runtime_exec_main + 420
21  MTD                                 0x00173685 mono_runtime_run_main + 725
22  MTD                                 0x00067495 mono_jit_exec + 149
23  MTD                                 0x002116c9 main + 2825
24  MTD                                 0x000032e5 start + 53

25 ??? 0x00000005 0x0 + 5

我做错了什么,还是这是一个错误?谢谢。

【问题讨论】:

  • 澄清一下,当我触摸“提交” SyledStringElement 时它会崩溃

标签: c# ios crash xamarin.ios monotouch.dialog


【解决方案1】:

避免这样的模式:

var navigationController = new UINavigationController(dialogViewController);
View.Add (navigationController.View);

因为一旦View.Add 调用完成,navigationController 将不会被引用(在 ma​​naged 端),并且垃圾收集器可以处理它(无论何时)。然而,从 native 方面来看,它应该会存在。返回(从 nativema​​naged)到已处置实例的调用将使您的应用程序崩溃。

正确的模式是将navigationController 声明为您的类型的字段(而不是局部变量)并在方法中创建/分配它。只要父实例存在,这将使navigationController 的引用保持活动状态(并确保任何回调都不会转到已处置的对象)。

例如

private UINavigationController navigationController;
...
public override void ViewDidLoad ()
{
    ...
    var dialogViewController = new DialogViewController(rootElement);
    navigationController = new UINavigationController(dialogViewController);

    View.Add (navigationController.View);
    ...
}

【讨论】:

  • 谢谢。这似乎已经停止了间歇性崩溃。
  • 好消息 :-) 行,例如 3 ??? 0xffffffff 0x0 + 4294967295,通常指向一个不再存在的实例(从本机框架调用时更是如此)。
猜你喜欢
  • 2022-11-02
  • 1970-01-01
  • 2011-11-22
  • 2021-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-09
  • 2018-12-11
相关资源
最近更新 更多