web-dev-qa-db-ja.com

NSZombieとは何ですか?

デバッグ中にNSZombieEnabledtrueに設定するという提案を見てきました。 NSZombieとは何ですか?フレームワークですか?設定ですか?

91
Moshe

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

この名前は、オブジェクトが通常カウント0に達すると「死んだ」と見なされるという事実に対する非常に明白な遊びです。この設定により、オブジェクトは奇妙な半減期に存在し続けます。本物のゾンビとよく似ていますが、食べる脳の数がかなり少ない点が異なります。

177
Adam Wright

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

ゾンビ検出へのより良いアプローチは、インストゥルメントを使用することです-XCodeから「インストゥルメントで実行」から開始し、「割り当て」を選択します。

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

編集:以前のアドバイスはXCode 3に関するものでしたが、XCode 4の追加は次のとおりです。

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

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

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

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

それは非常にうまく私の注意を引きます。

31
1
selva