为什么MonoTouch会在这个简单的代码上崩溃?

时间:2011-05-16 22:51:20

标签: xamarin.ios

我完全不明白为什么MonoTouch会崩溃这段代码。让我概述我的步骤,以达到这一点:

  1. 新项目
  2. 新>带控制器的iPhone视图(名为TestScreen
  3. 在Main.cs中,添加了:window.AddSubview(new TestScreen().View);
  4. 向TestScreen UIView添加了按钮,并在“文件所有者”(应该是我的TestScreen控制器)上添加了名为testButton的插座,并将按钮链接到该插座。
  5. 然后,我添加了以下代码:

    public override void ViewDidLoad ()
            {
                base.ViewDidLoad ();
    
                this.testButton.SetTitle("Test", UIControlState.Normal); // this works!
                this.testButton.TouchUpInside += HandleTestButtonhandleTouchUpInside;
            }
    
            int i = 0;
            void HandleTestButtonhandleTouchUpInside (object sender, EventArgs e)
            {
                i += 1;
                this.testButton.SetTitle("Testing " + i.ToString(), UIControlState.Normal); // this crashes!
            }
    

    问题是:为什么 this.testButton.SetTitle()方法导致崩溃?

    这是崩溃时的应用程序输出:

    堆栈跟踪:

    at(wrapper managed-to-native)MonoTouch.UIKit.UIApplication.UIApplicationMain(int,string [],intptr,intptr)   在MonoTouch.UIKit.UIApplication.Main(string [],string,string)[0x00038] in /Users/plasma/Source/iphone/monotouch/UIKit/UIApplication.cs:26   在/Users/plasma/Source/iphone/monotouch/UIKit/UIApplication.cs:31中的MonoTouch.UIKit.UIApplication.Main(string [])[0x00000]   在/Users/username/Projects/MyApp/MyApp/Main.cs:14中的MyApp.Application.Main(string [])[0x00000]   at(wrapper runtime-invoke).runtime_invoke_void_object(object,intptr,intptr,intptr)

    原生堆栈跟踪:

    0   MyApp               0x000d1965 mono_handle_native_sigsegv + 343
    1   MyApp               0x0000ffb4 mono_sigsegv_signal_handler + 322
    2   libSystem.B.dylib                   0x9476845b _sigtramp + 43
    3   ???                                 0xffffffff 0x0 + 4294967295
    4   UIKit                               0x01c981b5 -[UIControl sendAction:to:forEvent:] + 67
    5   UIKit                               0x01c9a647 -[UIControl(Internal) _sendActionsForEvents:withEvent:] + 527
    6   UIKit                               0x01c991f4 -[UIControl touchesEnded:withEvent:] + 458
    7   UIKit                               0x01c2e0d1 -[UIWindow _sendTouchesForEvent:] + 567
    8   UIKit                               0x01c0f37a -[UIApplication sendEvent:] + 447
    9   UIKit                               0x01c14732 _UIApplicationHandleEvent + 7576
    10  GraphicsServices                    0x03edfa36 PurpleEventCallback + 1550
    11  CoreFoundation                      0x00e21064 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 52
    12  CoreFoundation                      0x00d816f7 __CFRunLoopDoSource1 + 215
    13  CoreFoundation                      0x00d7e983 __CFRunLoopRun + 979
    14  CoreFoundation                      0x00d7e240 CFRunLoopRunSpecific + 208
    15  CoreFoundation                      0x00d7e161 CFRunLoopRunInMode + 97
    16  GraphicsServices                    0x03ede268 GSEventRunModal + 217
    17  GraphicsServices                    0x03ede32d GSEventRun + 115
    18  UIKit                               0x01c1842e UIApplicationMain + 1160
    19  ???                                 0x09a7714b 0x0 + 161968459
    20  ???                                 0x09a76f1c 0x0 + 161967900
    21  ???                                 0x09a7651c 0x0 + 161965340
    22  ???                                 0x09a76374 0x0 + 161964916
    23  ???                                 0x09a764c6 0x0 + 161965254
    24  MyApp               0x0000fd6f mono_jit_runtime_invoke + 1332
    25  MyApp               0x001ee239 mono_runtime_invoke + 137
    26  MyApp               0x001f0920 mono_runtime_exec_main + 669
    27  MyApp               0x001efd0a mono_runtime_run_main + 843
    28  MyApp               0x000a3c62 mono_jit_exec + 200
    29  MyApp               0x002a25eb main + 3838
    30  MyApp               0x000030c9 _start + 208
    31  MyApp               0x00002ff8 start + 40
    

    来自gdb的调试信息:

    /tmp/mono-gdb-commands.DGcT7h:1:源命令文件中出错: 无法调试自己

    =============================================== ================== 执行本机代码时获得SIGSEGV。这通常表示单声道运行时或应用程序使用的一个本机库中存在致命错误。

3 个答案:

答案 0 :(得分:1)

错误结果出现在我的第3步中。

我的new TestScreen()超出了范围并因某种原因被处理掉了。将其分配给变量,然后将变量传递给AddSubview()并修复它。

答案 1 :(得分:0)

this.InvokeOnMainThread(delegate{
              i += 1;
                          ((UIButton) sender).SetTitle("Testing " + i.ToString(), UIControlState.Normal);

            });

答案 2 :(得分:-1)

尝试将发件人转换为UIButton。我希望有所帮助。

void HandleTestButtonhandleTouchUpInside (object sender, EventArgs e)
    {
        i += 1;
        ((UIButton) sender).SetTitle("Testing " + i.ToString(), UIControlState.Normal);
    }