对于搜索,错误信息是:
This application is modifying the autolayout engine from a background thread, which can lead to engine corruption and weird crashes. This will cause an exception in a future release.
我知道这意味着一些 UIKit 代码是从后台线程调用的,我知道解决方案是将代码包装在
dispatch_async(dispatch_get_main_queue(), ^(void){ <code> });
我的问题是找到执行此操作的位置,因为打印的堆栈跟踪都没有引用我的应用程序代码。我证明这个否定的证据是在调试输出窗口中搜索(command-f)我的应用程序的名称;我已经转储了 24 个堆栈跟踪,并且我的应用程序名称不在其中,除了顶部的错误消息。我可以发布其中一个,但这似乎不是很有用。
在我今天处理的案例中,这发生在转换 View Controller 时,在 viewWillDisappear()
之后及之前 viewWillAppear()
.我找到了要包装的部分代码 dispatch_async()
周围,但现在都处理好了。我有断点和调试消息,其中与 View Controller 相关的对象被分配和释放,并且它们都在异常消息出现后触发。在调试和 Release模式下,模拟器和我的 iOS9 iPhone 都会发生这种情况。
如何识别明显修改 UI 的后台代码?
最佳答案
此代码 PSPDFUIKitMainThreadGuard导致主线程外的 UIKit 访问断言
使用步骤:
- 添加到项目并在不使用 ARC 的情况下编译此文件
- 移动
PSPDFAssert
定义到文件的第一个 PSPDFLogError
的评论电话因为它没有定义- 导入
<UIKit/UIKit.h>
如果尝试从后台线程修改任何 UI 元素,您的应用将崩溃并停止
为了快速使用以下代码:NBUIKitMainThreadGuard
关于iOS9 - 这个应用程序正在从后台线程修改自动布局引擎——在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32680303/