2011-05-16 178 views
0

我完全不明白爲什麼MonoTouch在這段代碼上崩潰。讓我來概括我的腳步去了這一點:爲什麼MonoTouch會在這個簡單的代碼中崩潰?

  1. 新建項目
  2. 新建> iPhone查看與控制器(稱爲TestScreen
  3. 在Main.cs補充說:window.AddSubview(new TestScreen().View);
  4. 添加按鈕, TestScreen UIView,並在'File's Owner'(它應該是我的TestScreen控制器)上添加一個名爲testButton的插座,並將按鈕鏈接到該插座。

然後,我添加以下代碼:

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()方法導致崩潰?

下面是在碰撞的時刻應用輸出:

堆棧跟蹤:

在(包裝管理到本機)MonoTouch.UIKit.UIApplication.UIApplicationMain(INT,串[],IntPtr的,IntPtr的)在MonoTouch.UIKit.UIApplication.Main處使用/Users/plasma/Source/iphone/monotouch/UIKit/UIApplication.cs:26 中的MonoTouch.UIKit.UIApplication.Main(string [],string,string)處的[0x00038]處的 /Users/username/Projects/MyApp中的MyApp.Application.Main(string [])[0x00000]處的/Users/plasma/Source/iphone/monotouch/UIKit/UIApplication.cs:31 中的字符串[])[0x00000] /MyApp/Main.cs:14 在(包裝紙運行時調用).runtime_invoke_void_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 /單GDB的命令.DGcT7h:1:來源命令文件中出錯: 無法自我調試

============================== =================================== 執行本機代碼時得到了一個SIGSEGV。這通常表示單聲道運行時或您的應用程序使用的某個本機庫中的致命錯誤。

+0

是testscreen的默認mainwindow.xib嗎? – 2011-05-24 09:36:21

回答

1

錯誤竟然是我的第3步

new TestScreen()是走出去的範圍和獲得安置出於某種原因。將其分配給一個變量,然後將變量傳遞給AddSubview()並修復它。

-1

嘗試將發件人轉換爲UIButton。我希望有所幫助。

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

他在示例中根本沒有使用發件人。 問題是爲什麼當它這樣調用時會崩潰 – 2011-05-24 09:29:55

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

      }); 
相關問題