我的应用程序会冻结,但没有错误出现。

40

有没有人知道如果我的应用程序冻结了我需要检查什么?我的意思是,我可以在iPad屏幕上看到应用程序,但是没有按钮响应。我尝试调试代码,当我点击按钮时,但我还没有看到任何东西。我正在阅读Instruments工具的相关内容; 具体来说我该如何使用它们?

有人能帮帮我吗?我只需要解释一下如何使用这些工具。


请问如何解决这个问题?你能给一些线索吗? - Ranjithkumar
1
按照Ben Baron的建议去做。在暂停后查看Xcode的左侧滑块,识别可能会阻塞UI的函数/线程。逐个注释每个函数并重新运行项目。然后您将能够确定哪个是导致应用程序冻结的原因。 - Ahmed Khedr
6个回答

117

听起来你可能阻塞了主线程。为了调试,在调试器中运行应用程序,当应用程序冻结时,点击Xcode底部日志区域上方的暂停按钮。然后在左侧,您将能够看到每个线程正在做什么,并且可以查看它停在哪里。

暂停按钮

可能是主线程上的长循环或同步死锁。


1
嗨,伙计!但我应该使用哪个工具呢?分配、泄漏、活动监视器,这是我第一次尝试使用Instruments,我不知道如何使用它...关于你可能的答案,我猜你可能是对的。因为当我点击按钮时,我调用一个弹出窗口并同时显示另一个视图,弹出窗口有自己的连接到Web服务,而视图控制器则有另一个连接... - Vanjo
7
你不需要使用任何工具,只需使用Xcode。点击Xcode左上方的运行按钮来运行你的应用程序。这将在调试器中运行。在你的应用程序中导航直到你复制了冻结。然后点击位于底部日志输出区域正上方、外形像||的小暂停按钮。它在日志区域上方的条形区域的左侧。一旦你暂停它,你就可以看到所有线程堆栈跟踪在左侧,并且你可以看到它卡在哪个方法上。 - Ben Baron
1
另外,您是使用同步还是异步连接到该网络服务?您不应在主线程上使用同步(阻塞)网络连接。 - Ben Baron
如果出现了一些延迟,那就会发生这种情况。你看不到这个延迟,但在我的情况下,我被路由器阻塞了。 - Vanjo
1
谢谢,对于我的情况,在第三方音频引擎中有一种丑陋的互斥锁。 - masaldana2
显示剩余2条评论

4

除了暂停并跟踪堆栈轨迹外,我认为还有一件额外的事情要做,就是检查代码中是否有任何导致应用程序冻结的循环。

最近我遇到了类似的问题,但堆栈跟踪并没有帮上太多忙。后来我发现,当在layoutsubviews方法中调用reloadData()时,我正在进行一个永久循环,这导致应用程序冻结,而且没有任何错误消息和instruments的帮助。


3

顶部的答案是正确的。您可以使用“暂停”选项进行调试。阻止主线程的最常见方法是在调度相同线程上的dispatch_sync。有时,您会从dispatch_once调用相同的代码。


1
我在我的项目中遇到了类似的情况,原因是另一个开发人员在方法layoutSubviews()中添加了setNeedsLayout(),导致无限循环并使应用程序冻结。

0

我建议检查您的大小,特别是在集合视图中,如果它们不适合,它们将会冻结您的应用程序,还要检查您的约束条件。


0

我也遇到了与iOS 13.4相同的问题,然后我尝试了上面的解决方案,但它并没有解决问题。所以我在Storyboard中有一个带有断点约束的元素。因此,在解决约束后,问题得到了解决。


1
欢迎 @anubhav verma 加入 StackOverflow,如果您能添加一些代码或解决问题的步骤,将会非常有帮助。如需更多帮助,请访问 https://stackoverflow.com/help/how-to-answer。 - Rajan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接