1

最近、開発中のアプリで問題が発生しました。アプリが EXC_BAD_ACCESS でクラッシュしています。自動参照カウントがオンになっているため、これは意味がありません。

アプリには、GKPeerPickerController を表示する IBAction にリンクされたボタンがあります。

-(IBAction)showPicker:(id)sender
{
picker = [[GKPeerPickerController alloc ] init];
picker.delegate = self;
picker.connectionTypesMask = GKPeerPickerConnectionTypeNearby;

[picker show];
}

release などの呼び出しでメモリを管理しようとすると、ARC がその呼び出しを無効にするというエラーが表示されるため、これは意味がありません。だから私が知っている限り、それについて私ができることは何もありません。クラッシュすると、EXC_BAD_ACCESS は、GKPeerPickerController を割り当てて初期化する行にあります。

4

1 に答える 1

1

これは、GKPeerPicker を 2 回目に起動しようとしたときにのみ発生しますか?

EXC_BAD_ACCESSアプリが「所有」していないメモリ ロケーションにアクセスしようとするとスローされます。これはさまざまな方法で発生する可能性があり、ARC を使用した場合でもクラッシュを診断するのは困難です。

EXC_BAD_ACCESS (SIGSEGV) クラッシュなどについては、この質問を確認してください。NSZombies を使用すると、何が起こっているのかを追跡できます。

ただし、何が起こっているのかをもう少し理解すると、このクラッシュを理解し、修正するのに役立つ場合があります。

最初の質問は、新しく割り当てられたオブジェクトを単に割り当てているときに、どうすれば EXC_BAD_ACCESS を取得できるのでしょうか? さて、「ARC の魔法」がここで発揮されます... その単純な割り当てステートメントは、インスタンス変数に新しいオブジェクトを割り当てています。コンパイラはそれを見て、次のように言います-ああ... ivarにはすでにオブジェクトが割り当てられている可能性がありますnil。 、新しい値を割り当てる前。

したがって、alloc/init が問題を引き起こしている可能性は低く、ivar に現在格納されているものである可能性が高いと思います... ivar の代わりにローカル変数pickerを作成するとどうなりますか?picker

-(IBAction)showPicker:(id)sender
{
     GKPeerPickerController *localPicker = [[GKPeerPickerController alloc ] init];
     localPicker.delegate = self;
     localPicker.connectionTypesMask = GKPeerPickerConnectionTypeNearby;

     [localPicker show];
}
于 2012-08-29T05:25:46.713 に答える