5

私はobjective-cxcodeを初めて使用し、現在作成中のアプリが悪名高いEXC_BAD_ACCESSエラーを受け取ります。

ほとんどの人は、 NSZombiesを使用して問題を解決することをお勧めします。NSZombies が動作していると思いますが、xcodeは、アプリがクラッシュしたときにメッセージが送信されたゾンビについてのアラートを出していません。

デバッグに進む前に、ゾンビ(割り当て解除されたオブジェクト)に送信されるメッセージが確実に発生するコードを実行したいと思います。

メッセージが割り当て解除されたオブジェクトに送信され、 NSZombiesが警告するシナリオを引き起こす単純なコード スニペットは何ですか?

4

2 に答える 2

7

非 ARC コードの場合:

- (IBAction) messageZombie:(id)sender {
    id a = [[NSObject alloc]init];
    [a release];
    NSLog(@"%@", [a description]);
}

これにより、ゾンビがオフの場合は EXC_BAD_ACCESS が表示され、ゾンビが有効の場合は「割り当て解除されたインスタンスにメッセージが送信されました」というメッセージが表示されます。

プロジェクトで ARC を使用している場合、割り当て解除されたオブジェクトにメッセージを確実に送信するのは少し難しくなります (結局のところ、これが ARCのポイントです)。

これは機能します:

- (IBAction) messageZombie:(id)sender {    
    id a = [[NSObject alloc]init];
    id __unsafe_unretained b =a;
    a=nil;
    NSLog(@"%@", [b description]);
}

__unsafe_unretained を使っているのは一体誰なのでしょうか? しかし、NSZombies が適切にオンになっていることを確認したいだけなら、これは妥当なテスト ケースです。

コード内の疑わしい場所を探している場合は、__unsafe_unretained ポインターを探しますが、何も見つかりません*。Cocoa オブジェクトにキャストされた CoreFoundation オブジェクトに正しいキャストが使用されていることを再確認してください。

* プロジェクトが 10.7 より前の OS X バージョン、または 5.0 より前の iOS バージョンをサポートする必要がある場合、__weak ポインターを使用できないため、そのようなプロジェクトでは、__unsafe_unretained がより頻繁に使用されることが予想されます。

于 2015-08-14T18:07:43.837 に答える
1

CF オブジェクトを作成し、それを Objective-C オブジェクトにブリッジしてから解放し、ブリッジされたオブジェクトを使用することができます。これを使用__bridgeして、希望どおりに動作させる必要があると思います。

于 2015-08-18T06:27:59.527 に答える