NSZombieとは何ですか?


回答:


191

これは、メモリのデバッグ支援です。具体的には、設定NSZombieEnabledすると、オブジェクトは割り当て解除されるのではなく、保持カウント0に達するたびに、NSZombieインスタンスに変化します。このようなゾンビがメッセージを受信すると、クラッシュしたり予測できない動作をしたりするのではなく、警告をログに記録します。そのため、高度なツールや干し草の山を探す手間をかけずに、微妙なリリースオーバー/オートリリースの問題をデバッグできます。

名前は、オブジェクトが保持カウント0に達したときに通常は「死んだ」と見なされるという事実をかなり明白に表しています。この設定では、オブジェクトは奇妙な半減期-生存していないか、完全に死んでいる-に存在し続けます。彼らがかなり少ない脳を食べることを除いて、本物のゾンビによく似ています。


61
この設定は基本的にすべてのオブジェクトをリークするため、デバッグが終了したらこの設定を削除するように注意してください。
ジャスティン

1
この簡単な説明をありがとう。Cocoa Dev Linkが機能しなくなったことを通知します。略して要点は+1。
CRDave 2014

95

Adamはゾンビが何であるかを説明する素晴らしい仕事をしましたが、環境変数を使用することはこれらを見つけて追跡するための最良の方法ではありません。

ゾンビ検出のはるかに優れたアプローチは、Instrumentsを使用することです-XCodeから「Run with Instrument」で開始し、「Allocations」を選択します。

次に、開始直後に記録を停止し、Allocations機器の「i」ボタンを押して、「参照カウントを有効にする」と「NSZombie検出を有効にする」をオンにします。次に、計測器で[録音]をもう一度押します。アプリが起動します。ゾンビオブジェクトが送信されると、メッセージの録音が停止し、録音タイムラインにダイアログボックスがポップアップします。これをクリックすると、オブジェクトがあった場所をすべて見つけることができます保持または解放されました。

編集:以前のアドバイスはXCode 3に対するものでしたが、ここにXCode 4に対する追加があります:

XCode 4.2では、ゾンビ検出を利用するさらに簡単なメカニズム、ゾンビインストゥルメントがあります。アプリを起動するために「実行」の代わりに、「プロファイル」を使用すると、インストゥルメントセレクターが表示されます。「ゾンビ」を選択すると、アプリが実行を開始します-クラッシュの原因となるものを実行すると、「ゾンビメッセージ」というダイアログがポップアップ表示されます。

そこから、ダイアログボックスの小さな矢印をクリックします。ゾンビオブジェクトが作成、保持、または解放されたすべての時間のリストが表示されます。サイドバーを引き上げると、保持カウントの各調整に関与したコードのスタックトレースを見て、各エントリに移動できます。


2
これは非常に役立つアドバイスです。
w.donahue、2011年

4
XCode 4の回答を更新しました。これにより、Instrumentsでゾンビ検出がさらに簡単になります。
Kendall Helmstetter Gelner、2011

実際には、XCode 5および6でもほとんど同じように動作するはずです。–
Kendall Helmstetter Gelner 14

2
私はまたしていることを確認することができますXCodeの7.2
ビート

31

Kendallが何を追加したかに同意します。これは非常に便利ですが、有効になっていることを忘れないように、環境変数を実行することをお勧めします。Cocoa Devでの(現在は期限切れの)リンクと同様に、私はこれを見逃さないように配置しました。

if(getenv("NSZombieEnabled") || getenv("NSAutoreleaseFreedObjectCheckEnabled")) {
    NSLog(@"ZOMBIES/AFOC ARE ENABLED!!! AAAAARRRRRRGH!!! BRAINS!!!");
} 

それは私の注意を非常に上手くとらえます。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.