iOS9 - 此应用程序正在从后台线程修改自动布局引擎 - 在哪里?
iOS9 - This application is modifying the autolayout engine from a background thread -- where?
对于搜索,错误信息是:
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> });
我的问题是找到在哪里执行此操作,因为打印的堆栈跟踪中 none 引用了我的应用程序代码。我证明这个否定的证据是在调试输出 window 中搜索 (command-f) 我的应用程序的名称;我有 24 个堆栈跟踪被转储出来,我的应用程序名称不在任何一个中,除了在顶部有错误消息。我可以 post 其中之一,但这似乎不是很有用。
在我今天处理的案例中,在 viewWillDisappear()
之后和 viewWillAppear()
之前转换视图控制器时会发生这种情况。我发现我的部分代码可以环绕 dispatch_async()
,但这些现在都已处理。我有断点和调试消息,其中分配和释放与视图控制器相关的对象,它们都在异常消息出现后触发。这在模拟器和我的 iOS9 iPhone 上都发生了,在调试和发布模式下都是如此。
如何识别明显修改 UI 的后台代码?
此代码 PSPDFUIKitMainThreadGuard 导致对 UI 主线程外的套件访问断言
使用步骤:
- 添加到项目并在没有 ARC 的情况下编译此文件
- 将
PSPDFAssert
定义移动到文件的第一个
- 未定义
PSPDFLogError
的注释调用
- 进口
<UIKit/UIKit.h>
您的应用程序将崩溃并停止任何尝试从后台线程UI修改任何元素
对于 swift 使用以下代码:NBUIKitMainThreadGuard
NSOperationQueue.mainQueue().addOperationWithBlock(){
[YOUR CODE]
}
编辑您的项目方案,并在 运行 操作下,在 诊断 选项卡中,在 运行time API Checking,确保选中 Pause in issues。当发生任何后台 UI 更新时,应用程序将暂停。
对于搜索,错误信息是:
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> });
我的问题是找到在哪里执行此操作,因为打印的堆栈跟踪中 none 引用了我的应用程序代码。我证明这个否定的证据是在调试输出 window 中搜索 (command-f) 我的应用程序的名称;我有 24 个堆栈跟踪被转储出来,我的应用程序名称不在任何一个中,除了在顶部有错误消息。我可以 post 其中之一,但这似乎不是很有用。
在我今天处理的案例中,在 viewWillDisappear()
之后和 viewWillAppear()
之前转换视图控制器时会发生这种情况。我发现我的部分代码可以环绕 dispatch_async()
,但这些现在都已处理。我有断点和调试消息,其中分配和释放与视图控制器相关的对象,它们都在异常消息出现后触发。这在模拟器和我的 iOS9 iPhone 上都发生了,在调试和发布模式下都是如此。
如何识别明显修改 UI 的后台代码?
此代码 PSPDFUIKitMainThreadGuard 导致对 UI 主线程外的套件访问断言
使用步骤:
- 添加到项目并在没有 ARC 的情况下编译此文件
- 将
PSPDFAssert
定义移动到文件的第一个 - 未定义
PSPDFLogError
的注释调用 - 进口
<UIKit/UIKit.h>
您的应用程序将崩溃并停止任何尝试从后台线程UI修改任何元素
对于 swift 使用以下代码:NBUIKitMainThreadGuard
NSOperationQueue.mainQueue().addOperationWithBlock(){
[YOUR CODE]
}
编辑您的项目方案,并在 运行 操作下,在 诊断 选项卡中,在 运行time API Checking,确保选中 Pause in issues。当发生任何后台 UI 更新时,应用程序将暂停。