Alt + CMD + Rを押して、Arguments> Environment VariablesでNSZombieEnabledをアクティブにしました。さらに、[診断]> [メモリ管理]> [ゾンビオブジェクトの有効化]でアクティブにしました。
ただし、ビルドして実行すると、ある時点でアプリがクラッシュし、コンソールにこの役に立たないメッセージが表示されます。
*** -[CALayer retainCount]: message sent to deallocated instance 0x656b260
スタックトレースはまったく役に立たない。詳細レベルのスライダーを右端まで動かしました。スレッド1は、これを単に示しています。
すべてがシステム所有であり、アプリに関連する単一の行はありません。したがって、明らかにNSZombiesEnabledは、Xcode 3のように機能しません。Xcode3では、死んだオブジェクトで停止しました。
which CALayerが早期に割り当て解除される方法を理解する方法はありますか?
更新:そのため、約100回以上ビルドして実行すると、問題は突然消えました!完全になくなった!そして最良の部分:私はコードを変更しませんでした!その間、ビルドフォルダーとプロジェクトをクリーンコマンドで数回クリーンアップし、シミュレーターでアプリも数回削除しました。
更新2:幸いなことに、問題が再発しました。そして今、それは永続的なようです。幸いなことに、私はユーザーをランダムに悩ませるよりも根本原因を見つけることを好みます。
更新3:最後に偶然見つけました:
startButton = newBttn;
になるはずだった:
self.startButton = newBttn;
startButtonは保持プロパティであり、-deallocでリリースしました。そのため、リリースが過剰になり、ビューがフェードアウトした後(ほとんどではありませんが)ほとんどの場合、クラッシュして異常なCALayer retainCountメッセージが表示されました。
Zombies Instrument(CMD + I)は、ボタンと関係があることをようやく指摘しました。理由と場所がわかりませんでした。
Clang Static Analyzerは、この明らかなグリッチについて文句を言いませんでした。
これが再び発生する場合は、専用のゾンビ楽器を実行できます。 Command + Iを押してアプリのプロファイルを作成し、ゾンビ機器を選択します(シミュレーターで実行する必要があります)。ゾンビを取得した場合は、そのオブジェクトのメモリ履歴全体(各保持/解放)を表示できます。これは、エラーの追跡に非常に役立ちます。
ジェフの素晴らしい答えに加えて。ほぼ同じことを行いますが、インストゥルメントを開いたり、アプリのプロファイルを作成したりすることなく、 NSZombieEnabled 、 MallocStackLogging 、および guard malloc を設定できますデバッガー。次に、アプリがクラッシュしたら、gdbコンソールに次のように入力します。
(gdb) info malloc-history 0x543216
置換0x543216
クラッシュの原因となったオブジェクトのアドレスを使用すると、はるかに有用なスタックトレースが得られ、問題の原因となっているコード内の正確な行を特定するのに役立ちます。