検索の場合、エラーメッセージは次のとおりです。
このアプリケーションは、自動レイアウトエンジンをバックグラウンドスレッドから変更しているため、エンジンの破損や奇妙なクラッシュを引き起こす可能性があります。これにより、将来のリリースで例外が発生します。
これは、UIKitコードがバックグラウンドスレッドから呼び出されることを意味します。解決策はコードをラップすることです
dispatch_async(dispatch_get_main_queue(), ^(void){ <code> });
私の問題は、印刷されたスタックトレースがアプリコードを参照していないため、どこでそれを行うかを特定することです。この否定を証明する証拠は、デバッグ出力ウィンドウでアプリの名前を検索(command-f)することです。 24個のスタックトレースをダンプしましたが、アプリメッセージの名前はそれらのいずれにもありません。ただし、上部にエラーメッセージが表示されています。そのうちの1つを投稿できますが、それはあまり役に立ちません。
私が今日取り組んでいるケースでは、viewWillDisappear()
の後、viewWillAppear()
の前にView Controllerを移行するときにこれが起こります。 dispatch_async()
をラップするコードの一部を見つけましたが、それらはすべて現在処理されています。 View Controllerに関連するオブジェクトが割り当ておよび割り当て解除されるブレークポイントとデバッグメッセージがあり、それらはすべて例外メッセージが表示された後にトリガーされます。これは、デバッグモードとリリースモードの両方で、シミュレーターとiOS9 iPhoneの両方で発生しています。
UIを明らかに変更しているバックグラウンドコードを特定するにはどうすればよいですか?
このコード PSPDFUIKitMainThreadGuard は、メインスレッド外のUIKitアクセスでアサーションを発生させます
使用手順:
PSPDFAssert
定義をファイルの最初に移動しますPSPDFLogError
の呼び出しをコメントする<UIKit/UIKit.h>
バックグラウンドスレッドからUI要素を変更しようとすると、アプリがクラッシュして停止します
Swiftの場合、次のコードを使用します。 NBUIKitMainThreadGuard