Xcode 4でNSZombieEnabledを設定するにはどうすればよいですか?


456

私はどのように設定するのですNSZombieEnabledCFZombieLevelのXcode 4で私の実行のために?


1
Xcode 4について質問していますか?
Jehiah

8
このようなオプションがデフォルトで有効になっていない理由は私を超えている...
Daniel Magnusson

26
これは基本的に、実際のメモリの解放を防止するため、デフォルトで有効にすることはお勧めしません。
チェタン

14
@Daniel Magnusson:それは生き残るのに最も適したものです。XCodeを使用した開発を非友好的ですが実行可能にすることで、より良い開発者を獲得できます。冗談だ。
Dan Rosenstark、2011

3
@DanielMagnussonこれは悪い考えではないと思います。「ゾンビ」モードでは、すべてのオブジェクトを特別な種類のobオブジェクトに変更して、メッセージが送信されたときに検出できるようにします。したがって、「ゾンビモード」を有効にすると、オブジェクトの割り当てが解除されることはないため、このようなエラーに対処する場合にのみ使用する必要があります。
Besi

回答:


753

Xcode 4.xで

R

(またはクリックMenubar> Product> Scheme> Edit Scheme

[診断]タブを選択し、[ゾンビオブジェクトを有効にする]をクリックします。

「ゾンビオブジェクトを有効にする」をクリックします

これにより、解放されたオブジェクトがNSZombieインスタンスになり、再び使用するとコンソールの警告が出力されます。これは、メモリ使用量は増加しますが(実際にはオブジェクトは解放されません)、エラー報告を改善するデバッグ補助です。

典型的なケースは、オブジェクトをオーバーリリースし、どのオブジェクトかわからない場合です。

  • ゾンビと: -[UITableView release]: message sent to deallocated instance
  • ゾンビなし: EXC_BAD_ACCESS

App Store送信用にアプリケーションをアーカイブする場合、このXcode設定は無視されます。アプリケーションをリリースする前に何かに触れる必要はありません。

押すことRは、Altキーを押したまま、[製品]> [実行]を選択することと同じです。
「ゾンビオブジェクトを有効にする」チェックボックスをクリックすることは、「引数」タブの「環境変数」セクションに「NSZombieEnabled = YES」を手動で追加することと同じです。


27
ありがとう-これらのオプションがどこに隠されているのかと思っていましたが、これは「スキームの編集」メニューと同じウィンドウだと気づきました。
2011

1
これを追加するために、「実行」画面で実行すると、「実行アクションのオプションを使用する」ボックスがチェックされている場合は「テスト」にも設定されます。テストのみを行う場合は、そのボックスをオフにする必要があります
Cameron

1
このオプションはXcode 4.1で表示されることにも注意してください(右?)
phi

2
XCode 5(および4以降のバージョン-確かに4.3.x)では、これはCMD-<CMD-SHIFT-comma)、またはProduct -> Scheme -> Edit SCheme...
Olie

1
私は、あなたがこのために私を指示することができれば、それはいいだろう、でもゾンビがスキップされ、奇妙なEXC_BAD_ACCESSの問題で立ち往生していますstackoverflow.com/questions/29210057/...
アヌープVaidya

70

Janoの答えは、それを見つける最も簡単な方法です。別の方法は、スキームドロップダウンバー->スキームの編集->引数タブをクリックし、環境変数列にNSZombieEnabledを追加し、値列にYESを追加することです...


57

私はこの代替手段がより便利だと思います:

  1. 「実行ボタンのドロップダウン」をクリックします
  2. リストから選択 Profile
  3. プログラム「Instruments」が開き、ここでも選択できます Zombies
  4. これで、アプリを操作してエラーを発生させることができます
  5. エラーが発生するとすぐに、オブジェクトが解放されたときに割り当てが解除されたときのヒントが表示されます。

ゾンビ

ゾンビが検出されるとすぐに、問題のオブジェクトがいつ割り当てられ、どこに保持または解放されたかを示すきちんとした「ゾンビスタック」が表示されます。

Event Type    RefCt     Responsible Caller
Malloc            1     -[MyViewController loadData:]
Retain            2     -[MyDataManager initWithBaseURL:]
Release           1     -[MyDataManager initWithBaseURL:]
Release           0     -[MyViewController loadData:]
Zombie           -1     -[MyService prepareURLReuqest]

Xcodeスキームの診断タブを使用する場合と比較した利点

  1. 診断タブでオプションのチェックを外すのを忘れると、オブジェクトはメモリから解放されません。

  2. 破損したオブジェクトが割り当てられた、解放された、または保持されたメソッドを示すより詳細なスタックが表示されます。


1
「ゾンビ」オプションがXCode 4にありません。なぜですか?
Li Fumin、2012年

4
iOS Simulator > Allメインテンプレートリストから選択していることを確認してください(これはシミュレータでのみ実行できます)
Besi

何らかの理由で..「ゾンビ」を選択すると、割り当てが表示されます。
abbood

これが最良の解決策です。私をたくさん助けた:)
のMichałMiszczyszyn

5

Xcode 4.2

  • プロジェクト名/スキームの編集/診断/
  • [ゾンビオブジェクトを有効にする]チェックボックス
  • あなたは終わった


1

Cocoaは、このような状況をデバッグする機能を大幅に強化する優れた機能を提供します。これはNSZombieEnabledと呼ばれる環境変数です 。objective-CでのNSZombieEnabledの設定について説明するこのビデオをご覧ください


-1

Xcode> 4.3の場合:

スキームドロップダウンバー->スキームの編集->引数タブをクリックし、環境変数列にNSZombieEnabledを追加し、値列にYESを追加します。

幸運を !!!

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