【问题标题】:iOS9 - This application is modifying the autolayout engine from a background thread -- where?iOS9 - 这个应用程序正在从后台线程修改自动布局引擎——在哪里?
【发布时间】:2015-09-20 14:09:46
【问题描述】:

对于搜索,错误信息是:

此应用程序正在从后台线程修改自动布局引擎,这可能会导致引擎损坏和奇怪的崩溃。这将在未来的版本中导致异常。

我知道这意味着一些 UIKit 代码是从后台线程调用的,我知道解决方案是将代码包装在

dispatch_async(dispatch_get_main_queue(), ^(void){ <code> });

我的问题是找到执行此操作的位置,因为打印的堆栈跟踪都没有引用我的应用程序代码。我证明这个否定的证据是在调试输出窗口中搜索(command-f)我的应用程序的名称;我已经转储了 24 个堆栈跟踪,并且我的应用程序名称不在其中,除了顶部的错误消息。我可以发布其中一个,但这似乎不是很有用。

在我今天处理的案例中,这发生在转换视图控制器时,在viewWillDisappear() 之后和viewWillAppear() 之前。我发现我的部分代码可以包裹dispatch_async(),但现在这些都已处理。我有断点和调试消息,其中与视图控制器相关的对象被分配和释放,并且它们都在异常消息出现后触发。在调试和发布模式下,模拟器和我的 iOS9 iPhone 都会发生这种情况。

如何识别明显修改 UI 的后台代码?

【问题讨论】:

  • 您是否在 ObjC 异常上设置了断点?如果是这样,当你收到这个错误时它会触发吗?
  • 是的,是的,每次触发的堆栈跟踪都会触发不止一次。

标签: ios objective-c xcode7


【解决方案1】:

此代码PSPDFUIKitMainThreadGuard 会在主线程之外对 UIKit 访问进行断言

使用步骤:

  1. 添加到项目并在不使用 ARC 的情况下编译此文件
  2. 将PSPDFAssert 定义移动到文件的第一个
  3. 评论调用PSPDFLogError,因为它没有定义
  4. 导入<UIKit/UIKit.h>

如果尝试从后台线程修改任何 UI 元素,您的应用将崩溃并停止

为了快速使用以下代码:NBUIKitMainThreadGuard

【讨论】:

  • 谢谢!这一下子就搞定了。还得#import <UIKit/UIKit.h>
  • “将 PSPDFAssert 定义移动到文件的第一个”是什么意思?
  • 那是因为它给你一个编译错误,因为它是在使用它之后定义的
  • 但它仍然显示警告现在该怎么办@MahmoudAdam
  • Swift Solution 感谢 nrbrook。
【解决方案2】:

编辑您的项目方案,并在 Run 操作下,在 Diagnostics 选项卡的 Runtime API Checking 下,确保 已选中暂停问题。当任何后台 UI 更新发生时,应用程序将暂停。

【讨论】:

  • 我设置了主线程检查器,但它不会在任何地方停止,但我可以在控制台中看到该错误消息。我找不到问题的根源,因为所有更新似乎都是从 MainThread 运行的(关键字“似乎”)
【解决方案3】:
NSOperationQueue.mainQueue().addOperationWithBlock(){
[YOUR CODE]
}

【讨论】:

  • 如何/为什么可以回答这个问题?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-27
  • 2017-05-14
  • 1970-01-01
  • 2016-06-20
  • 2023-04-11
  • 2018-01-23
相关资源
最近更新 更多