web-dev-qa-db-ja.com

iOS9-このアプリケーションは、自動レイアウトエンジンをバックグラウンドスレッドから変更しています-どこですか?

検索の場合、エラーメッセージは次のとおりです。

このアプリケーションは、自動レイアウトエンジンをバックグラウンドスレッドから変更しているため、エンジンの破損や奇妙なクラッシュを引き起こす可能性があります。これにより、将来のリリースで例外が発生します。

これは、UIKitコードがバックグラウンドスレッドから呼び出されることを意味します。解決策はコードをラップすることです

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

私の問題は、印刷されたスタックトレースがアプリコードを参照していないため、どこでそれを行うかを特定することです。この否定を証明する証拠は、デバッグ出力ウィンドウでアプリの名前を検索(command-f)することです。 24個のスタックトレースをダンプしましたが、アプリメッセージの名前はそれらのいずれにもありません。ただし、上部にエラーメッセージが表示されています。そのうちの1つを投稿できますが、それはあまり役に立ちません。

私が今日取り組んでいるケースでは、viewWillDisappear()の後、viewWillAppear()の前にView Controllerを移行するときにこれが起こります。 dispatch_async()をラップするコードの一部を見つけましたが、それらはすべて現在処理されています。 View Controllerに関連するオブジェクトが割り当ておよび割り当て解除されるブレークポイントとデバッグメッセージがあり、それらはすべて例外メッセージが表示された後にトリガーされます。これは、デバッグモードとリリースモードの両方で、シミュレーターとiOS9 iPhoneの両方で発生しています。

UIを明らかに変更しているバックグラウンドコードを特定するにはどうすればよいですか?

37
robm

このコード PSPDFUIKitMainThreadGuard は、メインスレッド外のUIKitアクセスでアサーションを発生させます

使用手順:

  1. プロジェクトに追加し、ARCなしでこのファイルをコンパイルします
  2. PSPDFAssert定義をファイルの最初に移動します
  3. 定義されていないため、PSPDFLogErrorの呼び出しをコメントする
  4. インポート<UIKit/UIKit.h>

バックグラウンドスレッドからUI要素を変更しようとすると、アプリがクラッシュして停止します

Swiftの場合、次のコードを使用します。 NBUIKitMainThreadGuard

55
Mahmoud Adam

プロジェクトスキームを編集し、Runアクションの下で、Diagnosticsタブ、Runtime API Checkingで、問題で一時停止がチェックされていることを確認します。バックグラウンドUIの更新が発生すると、アプリは一時停止します。

enter image description here

1
Ashley Mills