MonoTouch.Dialog崩溃

我有一个小testing应用程序,只是在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; 

如果我在每个屏幕上放一个button,我可以按页面浏览,

  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); 

和转储:

在MonoTouch.UIKit.UIApplication.Main(string[],string,string)上的<0xffffffff>在(包装托pipe到本机)MonoTouch.UIKit.UIApplication.UIApplicationMain(int,string [],intptr,intptr)<0x000b7> (包装运行时调用).tuntime_invoke_void_object(object,intptr,intptr,intptr)<0xffffffff>在MTD.Application.Main(string [])<0x00017>

本地堆栈跟踪:

 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

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

避免使用如下模式:

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

因为一旦View.Add调用完成, View.Add将不会被引用(在托pipe端),并且垃圾收集器可以处理它(只要它需要)。 但是从本地方面来看,它将会存在。 调用返回(从本机托pipe )到已处理的实例将使应用程序崩溃。

正确的模式是将navigationController声明为types的字段(而不是本地variables),并在方法中创build/分配它。 只要父实例存在(并确保任何callback不会到达一个处置的对象),这将保持对navigationController活动的引用。

例如

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