私は今日コードにあったいくつかのリークを修正していましたが、そうすることで、デバイスでコードを実行しているときにこのエラーが発生しました(シミュレーターは正常に動作します)。エラーを示すために写真を添付しました。
シミュレーターでは正常に動作するため、私のコードはそれとは何の関係もないと思います。私はそれを調べようとしましたが、私にとってうまくいくものは何も見つかりませんでした。これは私が使用しているARCと関係があることを私は知っています。
どんな助けでも大歓迎です
私は今日コードにあったいくつかのリークを修正していましたが、そうすることで、デバイスでコードを実行しているときにこのエラーが発生しました(シミュレーターは正常に動作します)。エラーを示すために写真を添付しました。
シミュレーターでは正常に動作するため、私のコードはそれとは何の関係もないと思います。私はそれを調べようとしましたが、私にとってうまくいくものは何も見つかりませんでした。これは私が使用しているARCと関係があることを私は知っています。
どんな助けでも大歓迎です
obj_retain
関数のアセンブリコードダンプを投稿しました。ブレークポイントハンドラは、無効なメモリアドレスから値を読み込もうとしていることを示します。
便利な名前に基づいてobjc_retainAutoreleasedReturnValue
、Objective-Cオブジェクトを返すと主張する関数/メソッドが実際にジャンク値(無効なポインター)を返し、それを保持しようとするとランタイムがクラッシュしているように見えます。
メインスレッドスタックの深さが2レベルしかないのは非常に奇妙です。
最適化をオンにしていますか?通常、デバッグモードではオフになり、リリースモードではオンになります。ポインタ変数を初期化するのを忘れる前に、バグに遭遇しました。デバッグモードではデフォルトで0に設定されていたため、コードは正常に機能しましたが、リリースモードではガベージ値が取得され、クラッシュが発生していました。
私が言えることはこれだけです。スクリーンショットにはあまり役立つ情報がありません。
クラッシュの時点で他のスレッドが何をしているかをデバッガーで確認してください。すでにメインスレッドで割り当てが解除されている、または割り当てが解除されているバックグラウンドスレッドのオブジェクトを使用している可能性があります。クラッシュが発生したときに別のスレッドが何かを実行している途中である場合は、それが原因である可能性があります。
私にもまったく同じエラーが発生し、それが私の場合の原因でした。
エラーがバックグラウンドスレッドではなくメインスレッドに表示された理由と、メインスレッドスタックに2つのエントリしか表示されなかった理由はまだわかりません。おそらく、ARCはメインスレッドのrunloop呼び出しの間にメモリクリーンアップ作業を行っています。割り当て解除されたメモリが別のスレッドによって上書きされるのは気に入らないと思います。