UIButton rightButton = UIButton.FromType (UIButtonType.DetailDisclosure);
rightButton.TouchUpInside += (o, e) => { Console.WriteLine("hello"); };
...
0 taggr 0x000908fc mono_handle_native_sigsegv + 284
1 taggr 0x00005c98 mono_sigsegv_signal_handler + 248
2 libsystem_c.dylib 0x95c2859b _sigtramp + 43
3 ??? 0xffffffff 0x0 + 4294967295
4 UIKit 0x0219355a -[UIApplication sendAction:toTarget:fromSender:forEvent:] + 61
5 UIKit 0x02238b76 -[UIControl sendAction:to:forEvent:] + 66
6 UIKit 0x0223903f -[UIControl(Internal) _sendActionsForEvents:withEvent:] + 503
7 UIKit 0x022382fe -[UIControl touchesEnded:withEvent:] + 549
8 UIKit 0x021b8a30 -[UIWindow _sendTouchesForEvent:] + 513
9 UIKit 0x021b8c56 -[UIWindow sendEvent:] + 273
10 UIKit 0x0219f384 -[UIApplication sendEvent:] + 464
11 UIKit 0x02192aa9 _UIApplicationHandleEvent + 8196
12 GraphicsServices 0x0478afa9 PurpleEventCallback + 1274
13 CoreFoundation 0x011951c5 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 53
14 CoreFoundation 0x010fa022 __CFRunLoopDoSource1 + 146
15 CoreFoundation 0x010f890a __CFRunLoopRun + 2218
16 CoreFoundation 0x010f7db4 CFRunLoopRunSpecific + 212
17 CoreFoundation 0x010f7ccb CFRunLoopRunInMode + 123
18 GraphicsServices 0x04789879 GSEventRunModal + 207
19 GraphicsServices 0x0478993e GSEventRun + 114
20 UIKit 0x02190a9b UIApplicationMain + 1175
21 ??? 0x09ff8784 0x0 + 167741316
22 ??? 0x09ff79d0 0x0 + 167737808
23 ??? 0x09ff7878 0x0 + 167737464
24 ??? 0x09ff7907 0x0 + 167737607
25 taggr 0x0000a002 mono_jit_runtime_invoke + 722
26 taggr 0x00169efe mono_runtime_invoke + 126
27 taggr 0x0016dfe4 mono_runtime_exec_main + 420
28 taggr 0x00173405 mono_runtime_run_main + 725
29 taggr 0x00067205 mono_jit_exec + 149
30 taggr 0x002116d5 main + 2837
31 taggr 0x00003055 start + 53
执行本机代码时获得了SIGSEGV。这通常表明 单声道运行时或其中一个本机库中的致命错误 由您的应用程序使用。
答案 0 :(得分:4)
根据它的上下文,该代码是对的和错的。让我们假设它是错误的(使用堆栈跟踪),因为它的使用方式如下:
void BadCase ()
{
UIButton rightButton = UIButton.FromType (UIButtonType.DetailDisclosure);
rightButton.TouchUpInside += (o, e) => { Console.WriteLine("hello"); };
}
在这种情况下,一旦方法返回(由于没有对局部变量的托管引用),可以收集(由垃圾收集器)rightButton
。但是,原生按钮仍然存在,并且会在触摸事件发生时尝试回调(进入托管代码)。这将导致崩溃(因为收集了托管实例)。
UIButton rightButton;
void GoodCase ()
{
rightButton = UIButton.FromType (UIButtonType.DetailDisclosure);
rightButton.TouchUpInside += (o, e) => { Console.WriteLine("hello"); };
}
您可以通过保留对按钮的引用来轻松避免这种情况,例如:通过将其从局部变量推广到字段。这将阻止GC收集托管按钮,直到放置实例(类型)。这意味着原生按钮将能够回调托管土地并输出您的hello
。