NSZombieEnabledロケータEXC_の設定BAD_ACCESSエラー
5397 ワード
http://unmi.cc/nszombieenabled-locate-exc_bad_access-error
私たちはiOSプログラムの開発でよくEXCに遭遇します.BAD_ACCESSエラーはCrashを招き、このようなエラーが発生した場合、一般的にXcodeは私たちに多くの情報を与えてエラーのソースを特定することはできません.ただ、アプリケーションDelegateにThread 1:Program received signal:“EXC_BAD_ACCESS”のように残して、問題を見つけることができません.
たとえば、解放されたオブジェクトにメッセージを送信すると表示されます.EXC_BAD_ACCESSは、releaseのオブジェクトやrelease、releaseのautoreleaseのオブジェクトなどもこのような間違いを報告します.デフォルトでは、Xcodeはどの行のコードなのか、解放されたオブジェクトを使用するべきではないのか、releaseが間違っているのかを特定しません.
例えば、UIViewControllerサブクラスのコード:
01
02
03
04
05
06
07
08
09
10
11
12
static
NSMutableArray
*array;
- (
void
)viewDidLoad
{
[
super
viewDidLoad];
array = [[
NSMutableArray
alloc] initWithCapacity:5];
[array release];
}
- (
void
) viewWillAppear:(
BOOL
)animated {
[array addObject:@
"Hello"
];
}
上のコードにEXC_が表示されますBAD_ACCESSエラーですが、私が実行中にXcodeエラーが発生したのは、AppDelegateのアプリケーション:d i d F i n ishLaunchingWithOptions:メソッドの行に位置しています.コード量が多くなったら、具体的な問題を探すのは難しいですが、経験に基づいています.
しかし、NSZombieEnabled環境変数は、NSZombieEnabled環境変数を設定すると、オブジェクトが破棄されると_に変換されます.NSZombie、NSZombieEnabledを設定すると、解放されたオブジェクトにメッセージを送信すると、そのオブジェクトは以前のようにCrashや理解しにくい動作を生成するのではなく、エラーメッセージを放出し、予測可能なdebugブレークポイントを生成するように消えてしまいます.そのため、具体的に、またはどのオブジェクトが誤って解放されたのかを見つけることができます.
XcodeにNSZombieEnabledが設定されている場合、Xcodeは行を明確に特定します[array addObject:@"Hello"]、コンソールに報告されたエラーメッセージは次のとおりです.
*** -[__NSArrayM addObject:]: message sent to deallocated instance 0x6557370
NSZombieEnabledの設定方法は、Xcode 3とXcode 4では設定が異なり、Xcode 4では設定が簡単です.Xcode 3でNSZombieEnabledの設定方法は以下の通りです.
1.XCodeの左側のGroups&FilesバーでExecutablesを見つけ、その中の1つをダブルクリックするか、Get Infoを右クリックします.2.Arguments 3に切り替える.ここには全部で2つのボックスがあり、下のVariables to be set in the environment:点+番号に1つ追加し、NameにNSZombieEnabled、ValueにYesを記入し、前のフックが選択されていることを保証します.
Xcode 4でNSZombieEnabledを設定する方法:
Xcode 4メニューProduct->Edit Scheme->Argumentsをクリックし、「プラス記号」をクリックし、NSZombieEnabledパラメータをEnvironment Variablesウィンドウに追加し、後ろの数値を「YES」と書きます.
または、Xcode 4メニューProduct->Edit Scheme->Diagnostics設定ウィンドウにEnable Zombie Objectsを直接チェックすると、Xcodeはcmd+shift+<でこのウィンドウに進みます.
Xcode 4は現在の要件を考慮しているので、より便利な設定を提供しています.このウィンドウで他のパラメータを設定することもできます.これにより、より多くのヘルプ情報を得ることができます.
また、XcodeにNSZombieEnableを設定していない場合は、次のようなコードが正しく実行され、あなたが望む結果「Hello」が印刷されるかもしれません.
01
02
03
04
05
06
07
08
09
10
static
NSMutableArray
*array;
- (
void
)viewDidLoad
{
[
super
viewDidLoad];
array = [[
NSMutableArray
alloc] initWithCapacity:5];
[array release];
[array addObject:@
"Hello"
];
NSLog
(@
"%@"
, [array objectAtIndex:0]);
}
しかしNSZombieEnableの設定を加えると、上のコード行[array addObject:@"Hello"]も投機的にうまくいかず、同じようにエラーメッセージが表示されます.
*** -[__NSArrayM addObject:]: message sent to deallocated instance 0x6557370
このarrayが指すメモリが元のデータであってもNSZombieEnableの法眼から逃れることはできない.つまり、NSZombieEnableを設定していない場合に上記のコードが正しい結果を得ることができるのは、[array release]はメモリブロックを解放するようにマークされているが、後でarrayを使用する場合、そのポインタが指すメモリデータが上書きされていないため、エラーが発生しないため、C++のポインタdelete後の効果と同じである.
参考:1. NSZombieEnabledソリューションEXCを設定するBAD_ACCESSエラー 2. EXCを検索BAD_ACCESS問題の根源の方法 3. XCodeデバッグテクニック-葛藤のEXC_BAD_ACCESS