我试图在XCode中添加一个符号断点,以检查后台线程上的UI引擎修改。
我要做的是:

但是,我得到的错误消息总是:
Stopped due to an error evaluating condition of breakpoint 5.1: "!Thread.isMainThread"
Couldn't parse conditional expression:
error: use of undeclared identifier 'Thread'
UI Engine must be modified on main thread.我不明白为什么断点条件不能评估我的状况。有人能解释我在这里做错了什么吗?我也试过把这个放到Obj里,结果没什么好运气。
编辑:Obj版本,这里:!(BOOL)[NSThread isMainThread]
编辑2: Xcode版本11.3 (11C29)
编辑3:好,关闭XCode并重新打开使Obj版本“工作”--它们每次在断点上停顿4到5分钟。这实际上使这些断点不可用。不知道怎么解决这个问题。
发布于 2020-01-28 20:32:05
我能够让您原来的符号断点按预期工作,方法是将条件写为
(BOOL)[NSThread isMainThread] == NO我怀疑有一个更好的方法,把BOOL和NO直接比较是非常糟糕的风格,但至少它让我通过了“不工作”阶段到“确实有效”阶段。
发布于 2020-01-28 05:14:02
为了澄清,设置符号断点和使用条件确实有效,但我会冒险说self和Thread不能作为UIKit框架的大部分符号使用,因为其中大多数都没有可用的调试信息,因此出现了错误:使用未声明的标识符'Thread‘。
见这篇文章的答案:
How to log out self when add a symbol breakpoint at -[UIViewController viewWillAppear] method
还有关于为子类创建符号断点以及使用objective条件的可能解决方法的其他信息如下:
Using of symbolic breakpoints for child classes in Xcode?
尽管如此,如果您只对调用该方法(layoutSubviews)的模块中的特定类感兴趣,则可以在符号断点内指定模块,并且如果您有该方法的自己的实现(例如,您在类代码中重写了该方法),则条件Thread.isMainThread或!Thread.isMainThread实际上将适用于该类。
我知道这实际上并不能解决您的困境,特别是当您需要检查layoutSubviews的所有调用时,但我希望它至少有助于解释为什么使用线程的条件不总是有效的。
https://stackoverflow.com/questions/59940581
复制相似问题