菜鸟教程小白 发表于 2022-12-13 05:56:10

ios - 应用程序在 UIViewController : com. apple.main-thread 中的用户设备上崩溃


                                            <p><p>我使用 fabric.io 来跟踪用户设备上的崩溃。我收到许多带有以下堆栈跟踪的崩溃报告:</p>

<pre><code>0 libobjc.A.dylib 0x33e9ef46 objc_msgSend + 5
1 UIKit 0x29698225 + + 196
2 UIKit 0x29697cfb - + 442
3 UIKit 0x29697b1f - + 214
4 UIKit 0x29697a41 - + 416
5 UIKit 0x295fc245 forwardTouchMethod + 236
6 UIKit 0x294ae567 - + 522
7 UIKit 0x294a7e31 - + 544
8 UIKit 0x2947e759 - + 196
9 UIKit 0x296f22f9 _UIApplicationHandleEventFromQueueEvent + 14168
10 UIKit 0x2947d1a9 _UIApplicationHandleEventQueue + 1352
11 CoreFoundation 0x25f27fbf __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 14
12 CoreFoundation 0x25f273cf __CFRunLoopDoSources0 + 218
13 CoreFoundation 0x25f25a35 __CFRunLoopRun + 772
14 CoreFoundation 0x25e733b1 CFRunLoopRunSpecific + 476
15 CoreFoundation 0x25e731c3 CFRunLoopRunInMode + 106
16 GraphicsServices 0x2d3d3201 GSEventRunModal + 136
17 UIKit 0x294dd43d UIApplicationMain + 1440
</code></pre>

<p>所以在整个堆栈跟踪中,我的代码没有一行。我想不出发生这种情况的任何原因。</p>

<p>有没有人有同样的问题或想法如何解决这个问题?</p>

<p>提前致谢</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>我也遇到过类似的问题,我得到的崩溃报告和你的差不多。</p>

<p>当用户点击状态栏滚动到 UIScrollView 的顶部时,您的崩溃肯定是应用崩溃的情况。这正是我遇到的。</p>

<p>根本原因是我在调用 viewDidAppear 之前调用了 。 </p>

<p>如果你在 ViewController 出现之前调用 UIScrollView setContentOffset,iOS 系统会在 UIScrollView 实例被释放后尝试保留它,从而导致 SIGEV 或 SIGBUS。</p>

<p>如果你使用 Enable Zombie Objects 调试你的应用程序,你肯定会得到类似的东西</p>

<blockquote>
<p>: message sent to deallocated instance
0x1371a7600</p>
</blockquote>

<p>。 </p>

<p>如果您想重现崩溃,我建议您执行以下操作。</p>

<ol>
<li><p>创建两个 ViewController ,都将 UIScrollView 实例添加到 View 层次结构中。</p></li>
<li><p>将它们推送到导航堆栈,并确保在 viewDidLoad 和 viewDidAppear 之前为它们调用 setContentOffset。 </p></li>
<li><p>弹出一个 ViewController 并将另一个留在导航堆栈中</p></li>
<li><p>点击状态栏。</p></li>
</ol>

<p>解决方法是检查 ViewController 的view.window属性是否为nil,如果为nil,则不要调用UIScrollView实例的setContentOffset,延迟所有对setContentOffset的调用,直到view.window为非nil。</p>

<p>我也写了一篇关于这个的博文。虽然我的博客是中文的,但是我添加了崩溃时调用堆栈的截图,你可以看到调用堆栈和这个问题的堆栈是一样的.</p>

<p> <a href="https://huang.sh/2016/07/%e5%ae%9a%e4%bd%8d%e5%b4%a9%e6%ba%83uikituiviewcontroller-_viewcontrollerforfullscreenpresentationfromview/" rel="noreferrer noopener nofollow">https://huang.sh/2016/07/%e5%ae%9a%e4%bd%8d%e5%b4%a9%e6%ba%83uikituiviewcontroller-_viewcontrollerforfullscreenpresentationfromview/</a> </p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 应用程序在 UIViewController : com. apple.main-thread 中的用户设备上崩溃,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/29121949/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/29121949/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 应用程序在 UIViewController : com. apple.main-thread 中的用户设备上崩溃