今日、かなり興味深い exc_bad_access クラッシュが発生しました。たくさん掘り下げた後、次の情報を思いつきました(シミュレーターで実行):
コードを実行しただけでは、管理対象オブジェクトにデータをロードしているときに、アプリがランダムな時点でランダムにクラッシュします。私が知る限り、管理対象オブジェクトにデータをロードすると、常にクラッシュしていました。JSON dict からデータ、実際に使用されるオブジェクト (文字列と NSNull から ints/floats と nils へ) に変換されたセクションではありません。
もちろん、ランダムなクラッシュは悪いことなので、デバッガーでプロセスをステップ実行しようとしましたが、実用的ではありませんでした。多くのオブジェクトを処理していたので、それらを 1 つずつステップ実行してもうまくいきませんでした。動作しません。そこで、NSLog をいくつか追加してプロセスを追跡し、その方法でパターンを特定することにしました。
クラッシュを即座に解決しました。
プロセスの任意の場所で 1 つの NSLog がクラッシュを防止しました。
最終的にスタック トレースを追跡したところ、実際の問題が見つかりました。スレッド化された環境でマネージド オブジェクトにアクセスしていましたが、関連する MOC の performBlockAndWait: メソッド内からではありませんでした。その時点で、クラッシュは私には信じられないほど明らかでした。以前は問題が発生していなかったことにショックを受けました。2 ~ 3 個のオブジェクトからなる「小さな」テスト データ セットと、そこに NSLogs を使用したデバッグ コードを用意することで、以前はエラーがかなり効果的にマスクされていたと確信していますが、疑問は残ります。
NSLog によってアプリのクラッシュが防止されるのはなぜですか? 副作用のないコードが、アプリの残りの部分の実行をどのように変更するのでしょうか? これは意味がありません!