設定NSZombieEnabled = Yes
すると、コンソールには何も書き込まれません。どうすればこれを修正できますか? または、他のツールを教えてもらえますEXC_BAD_ACCESS
か?
8 に答える
昔ながらのクラッシュがあります。EXC_BAD_ACCESSは、アプリケーションが無効なメモリアドレスにアクセスしようとしたことを意味します。GC以外のObjective-cアプリケーションでこれが発生する最も一般的な理由は、ゾンビモードが検出する割り当て解除後にオブジェクトにメッセージを送信することですが、この特定のクラッシュは他のさまざまな方法で発生する可能性があります(図を参照)。
アプリケーションがクラッシュしているため、バックトレースが必要です。私たちの誰もがあなたをさらに助けることができるように、あなたはここにそのバックトレースを投稿する必要があります。
Bradが言ったように、デバッグを有効にしてアプリケーションを実行します。Xcodeでは、[実行]メニューの下に[実行/デバッグ]メニュー項目があります。それを使用してください。アプリケーションがクラッシュすると、デバッガウィンドウの左上隅にスタックトレースが表示されます。
いいえ、実際には、デバッガーに表示されます。写真は1,000語の価値があります。
(出典:friday.com)
「EXC_BAD_ACCESS」は、必ずしもゾンビ インスタンスに関連しているわけではありません。ローカル変数のような未定義の参照へのアクセスにリンクできます。
NSArray *array;
[array objectAtIndex:0]; // <- Will throw an error
編集: NSZombie フラグは、割り当て解除されたインスタンスの使用によってトリガーされた「EXC_BAD_ACCESS」を解決するのにのみ役立ちます。
バグを解決するには、クラッシュ バックトレースを使用して、間違っている場所を特定する必要があります。次に、コードに戻り、すべての割り当てと割り当てを確認します。
この質問への答えが実際に質問にどのように答えているのかわかりません..
私は自分自身に同じことを尋ねています。xcode4 を使用して、EXC_BAD_ACCESS でクラッシュする代わりに、解放されたオブジェクトにアクセスするときに NSZobmieEnabled = YES を停止できるようにしました。これは非常に役立ちます。
当面の質問は次のとおりです。
「NSZombieEnabled = Yes を設定すると、コンソールに何も書き込まれません。これを修正するにはどうすればよいですか...」.
シンプルでまっすぐ。
私は同じ問題を経験しています。xcode はデバッガーで停止しますが、コンソールにはメッセージが表示されません。私は次の行に沿って何かを期待します:
「割り当て解除されたインスタンスにメッセージが送信されました...」.
また、使用する前にすべてのポインタを nil に初期化してください!
nil やその他のオブジェクトに初期化せずにポインタを使用すると、自分のものではないメモリにアクセスすることになる可能性があります。
たとえば、次のコードは、最後の行によって引き起こされた NSZombieEnabled フラグを使用して追跡できない EXC_BAD_ACCESS も提供します。
RecordingLocation* closest;
//find the closest recording location
for (...)
{
//try to find the closest object...
//suppose we don't find anything so closest is never set.
}
if (closest!=nil)
NSLog(@"Closest: %f,%f",closest.x,closest.y);
Stack Overflow で EXC_BAD_ACCESSを検索すると、同じ問題を抱えている人がたくさん見つかります。これにヒットするほとんどの場合、メモリの問題が発生しています。ここまたはここで説明されているプロトコルに従っていて、解放されたオブジェクトにメッセージが送信されたというレポートがコンソールに表示されない場合は、別の問題である可能性があります。
デバッガーでアプリケーションを起動しようとしましたか (実行 | デバッグ - ブレークポイント オン)。EXC_BAD_ACCESS を押すとすぐに、デバッガーが停止するはずです。デバッガー (実行 | デバッガー) に表示されるバックトレースを見ると、エラーが発生した場所がわかる場合があります。
NSZombieEnabled が機能しない状態でこれをじっと見つめて幸せな 20 分間を過ごしたので、これを追加すると EXC_BAD_ACCESS が発生すると思いました
NSArray *arr = [NSArray arrayWithObjects:@"@dog","@cat",nil];
2 番目のパラメータに「@」がないことに注意してください。私はしませんでした :-)
EXC_BAD_ACCESS で別の経験があったので、共有したいと思います。
質問で述べたように、NSZombieEnabled がチェックされていても、コンソールには何も書き込まれませんでした。シミュレーターで数時間格闘した後、デバイスにインストールすることにしました。デバイスでのデバッグから得たエラー メッセージは、より役に立ちました。
最終的に、前日にいくつかのxib ファイルの名前を変更したため、EXC_BAD_ACCESS エラーと奇妙な動作が発生していることに気付きました。MainWindow.xib ファイルの「View Controller」オブジェクトを選択し、NIB Nameプロパティを修正しました。その後、すべてがスムーズに機能しました。
NSZombie を有効にしてもすべての EXC_BAD_ACCESS が見つかるわけではないと思い
ます.ゾンビを使用しているときに結果が得られない場合もあるため..ゾンビ
を有効にすることで、リリースされたオブジェクトの使用に関連する EXC_BAD_ACCESS のみが表示されると思います。
そして、ゾンビを使用しているときに気付いたもう1つの問題は、デバッグ時にクラッシュすることもあります。私がキャッチした 1 つのケースがクラッシュし、次のように表示
*** -[MagazineWebview respondsToSelector:]: message sent to deallocated instance 0x58ce2a0
されました。
私がやっていることは、
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
現在の「MagazineWebview」オブジェクトを解放し、指定された [リクエスト URL] を別の「MagazineWebview」オブジェクトにロードすることです。私のいくつかの機能を達成するために...
ありがとう