デバッグ中にに設定NSZombieEnabled
するよう提案する提案を見てきましたtrue
。NSZombieとは何ですか?フレームワークですか?設定?
デバッグ中にに設定NSZombieEnabled
するよう提案する提案を見てきましたtrue
。NSZombieとは何ですか?フレームワークですか?設定?
回答:
これは、メモリのデバッグ支援です。具体的には、設定NSZombieEnabled
すると、オブジェクトは割り当て解除されるのではなく、保持カウント0に達するたびに、NSZombie
インスタンスに変化します。このようなゾンビがメッセージを受信すると、クラッシュしたり予測できない動作をしたりするのではなく、警告をログに記録します。そのため、高度なツールや干し草の山を探す手間をかけずに、微妙なリリースオーバー/オートリリースの問題をデバッグできます。
名前は、オブジェクトが保持カウント0に達したときに通常は「死んだ」と見なされるという事実をかなり明白に表しています。この設定では、オブジェクトは奇妙な半減期-生存していないか、完全に死んでいる-に存在し続けます。彼らがかなり少ない脳を食べることを除いて、本物のゾンビによく似ています。
Adamはゾンビが何であるかを説明する素晴らしい仕事をしましたが、環境変数を使用することはこれらを見つけて追跡するための最良の方法ではありません。
ゾンビ検出のはるかに優れたアプローチは、Instrumentsを使用することです-XCodeから「Run with Instrument」で開始し、「Allocations」を選択します。
次に、開始直後に記録を停止し、Allocations機器の「i」ボタンを押して、「参照カウントを有効にする」と「NSZombie検出を有効にする」をオンにします。次に、計測器で[録音]をもう一度押します。アプリが起動します。ゾンビオブジェクトが送信されると、メッセージの録音が停止し、録音タイムラインにダイアログボックスがポップアップします。これをクリックすると、オブジェクトがあった場所をすべて見つけることができます保持または解放されました。
編集:以前のアドバイスはXCode 3に対するものでしたが、ここにXCode 4に対する追加があります:
XCode 4.2では、ゾンビ検出を利用するさらに簡単なメカニズム、ゾンビインストゥルメントがあります。アプリを起動するために「実行」の代わりに、「プロファイル」を使用すると、インストゥルメントセレクターが表示されます。「ゾンビ」を選択すると、アプリが実行を開始します-クラッシュの原因となるものを実行すると、「ゾンビメッセージ」というダイアログがポップアップ表示されます。
そこから、ダイアログボックスの小さな矢印をクリックします。ゾンビオブジェクトが作成、保持、または解放されたすべての時間のリストが表示されます。サイドバーを引き上げると、保持カウントの各調整に関与したコードのスタックトレースを見て、各エントリに移動できます。
Kendallが何を追加したかに同意します。これは非常に便利ですが、有効になっていることを忘れないように、環境変数を実行することをお勧めします。Cocoa Devでの(現在は期限切れの)リンクと同様に、私はこれを見逃さないように配置しました。
if(getenv("NSZombieEnabled") || getenv("NSAutoreleaseFreedObjectCheckEnabled")) {
NSLog(@"ZOMBIES/AFOC ARE ENABLED!!! AAAAARRRRRRGH!!! BRAINS!!!");
}
それは私の注意を非常に上手くとらえます。