菜鸟教程小白 发表于 2022-12-12 19:45:14

ios - 单击注释上的右侧详细信息披露按钮时,MonoTouch 会引发 SIGSEGV


                                            <p><h1>代码:</h1>

<pre><code>UIButton rightButton = UIButton.FromType (UIButtonType.DetailDisclosure);

rightButton.TouchUpInside += (o, e) =&gt; { Console.WriteLine(&#34;hello&#34;); };
</code></pre>

<h1>堆栈跟踪:</h1>

<p>...</p>

<h1> native 堆栈跟踪:</h1>

<pre><code>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 - + 61
5   UIKit                               0x02238b76 - + 66
6   UIKit                               0x0223903f - + 503
7   UIKit                               0x022382fe - + 549
8   UIKit                               0x021b8a30 - + 513
9   UIKit                               0x021b8c56 - + 273
10UIKit                               0x0219f384 - + 464
11UIKit                               0x02192aa9 _UIApplicationHandleEvent + 8196
12GraphicsServices                  0x0478afa9 PurpleEventCallback + 1274
13CoreFoundation                      0x011951c5 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 53
14CoreFoundation                      0x010fa022 __CFRunLoopDoSource1 + 146
15CoreFoundation                      0x010f890a __CFRunLoopRun + 2218
16CoreFoundation                      0x010f7db4 CFRunLoopRunSpecific + 212
17CoreFoundation                      0x010f7ccb CFRunLoopRunInMode + 123
18GraphicsServices                  0x04789879 GSEventRunModal + 207
19GraphicsServices                  0x0478993e GSEventRun + 114
20UIKit                               0x02190a9b UIApplicationMain + 1175
21???                                 0x09ff8784 0x0 + 167741316
22???                                 0x09ff79d0 0x0 + 167737808
23???                                 0x09ff7878 0x0 + 167737464
24???                                 0x09ff7907 0x0 + 167737607
25taggr                               0x0000a002 mono_jit_runtime_invoke + 722
26taggr                               0x00169efe mono_runtime_invoke + 126
27taggr                               0x0016dfe4 mono_runtime_exec_main + 420
28taggr                               0x00173405 mono_runtime_run_main + 725
29taggr                               0x00067205 mono_jit_exec + 149
30taggr                               0x002116d5 main + 2837
31taggr                               0x00003055 start + 53
</code></pre>

<p>在执行 native 代码时获得了 SIGSEGV。这通常表明
单声道运行时或 native 库之一中的 fatal error
由您的应用程序使用。</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>该代码是对还是错,取决于它的上下文。让我们假设它是错误的(使用堆栈跟踪),因为它的用法如下:</p>

<pre><code>void BadCase ()
{
    UIButton rightButton = UIButton.FromType (UIButtonType.DetailDisclosure);
    rightButton.TouchUpInside += (o, e) =&gt; { Console.WriteLine(&#34;hello&#34;); };
}
</code></pre>

<p>在这种情况下,<code>rightButton</code> 可以在方法返回后被收集(由垃圾收集器)(因为没有对局部变量的托管引用)。但是,<strong>native</strong> 按钮仍然可以存在,并且会在触摸事件发生时尝试回调(到 <strong>托管</strong> 代码中)。这将导致崩溃(因为收集了 <strong>托管</strong> 实例)。</p>

<pre><code>UIButton rightButton;

void GoodCase ()
{
    rightButton = UIButton.FromType (UIButtonType.DetailDisclosure);
    rightButton.TouchUpInside += (o, e) =&gt; { Console.WriteLine(&#34;hello&#34;); };
}
</code></pre>

<p>您可以通过保留对按钮的引用来轻松避免这种情况,例如通过将其从局部变量提升到字段。这将阻止 GC 收集 <strong>ma​​naged</strong> 按钮,直到实例(类型的)被释放。这意味着 <strong>native</strong> 按钮将能够回调到 <strong>ma​​naged</strong> 土地并输出您的 <code>hello</code>。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 单击注释上的右侧详细信息披露按钮时,MonoTouch 会引发 SIGSEGV,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/9772930/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/9772930/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 单击注释上的右侧详细信息披露按钮时,MonoTouch 会引发 SIGSEGV