为什么在禁用断点时我的应用程序会挂起?

问题描述 投票:0回答:1

我有一个使用多个 ManagedObjectContext 的应用程序。

我正在使用 Objective-C。

使用 NSPrivateQueueConcurrencyType 创建一个 MOC。其余的都是使用 NSMainQueueConcurrencyType 创建的。

每当我使用 MOC 时,我都会使用 [performBlockAndWait:]。

当我在禁用断点的情况下运行应用程序时,应用程序将挂起。堆栈跟踪显示有 2 个线程尝试运行 PerformBlockAndWait。

如果我在启用断点的情况下运行应用程序,并且有多个断点会中断我的代码,则应用程序不会挂起。

我在网上搜索过,虽然我看到了一些有关挂起的条目,但没有任何帮助,也没有找到任何符合我的情况的内容。

在performBlockAndWait如何工作以及何时适合或不适合使用方面,我显然遗漏了一些东西(或很多东西)。

非常需要一些帮助/提示。这真是令人沮丧。

Xcode 版本为 15.3,iOS/iPadOS 的部署目标为 16.4。

ios objective-c xcode ipad core-data
1个回答
0
投票

performBlockAndWait
很容易造成死锁。许多死锁都是对时间敏感的,因此如果添加断点,就可以完全改变时间并创建或避免在其他情况下可能发生的死锁。即便如此,竞争条件仍然存在并且必须得到解决。您的堆栈跟踪将准确地显示这是如何发生的,所以从这里开始。

performBlockAndWait
中的任何内容都必须非常简单,并且其本身不依赖于任何其他可能重新进入的阻塞操作,这一点至关重要。如果您的
peformBlockAndWait
调用任何重要方法,您需要探索该方法是否也会阻塞。理想情况下,您应该完全避免
performBlockAndWait
并使用更简单的
perform
来代替。

© www.soinside.com 2019 - 2024. All rights reserved.