0

オブジェクトを解放しているときに発生する奇妙な問題があります。オブジェクトのdeallocメソッドで、別の (サブ) オブジェクトを解放しています。このサブオブジェクトが解放されると、EXC_BAD_ACCESS エラーが発生します。release を呼び出す直前に、サブオブジェクトが有効なポインターであると確信しています。

これが私が奇妙なことを確認した方法です-サブオブジェクトのリリースの直前に、deallocメソッド内にブレークポイントを設定し、割り当てられました! メッセージを送信でき、正しく応答します。もう 1 つの奇妙なバグは、NSZombieEnabled が YES に設定されている場合、エラーがまったく発生せず、解放されたオブジェクトにメッセージを送信したという NSZombie の通常のエラーでさえ、コードが適切に実行されることです。

これを解決する方法を知っている人はいますか?

前もって感謝します!


*編集1 *

[super dealloc] を dealloc の最後に配置するとクラッシュすることがわかりましたが、最初に配置するとクラッシュしません。以前に似たようなことがありましたが、逆に、dealloc の開始時に [super dealloc] を実行するとアプリがクラッシュし、最後にはクラッシュしませんでした。

なぜそれが違いを生むのか、いつ何を使うべきなのか?


*編集2 *

スクラッチ編集 #1! どちらの方法でも機能しません。

4

2 に答える 2

1

あなたの dealloc ルーチンはたまたま次のようになっていますか?

- (void)dealloc
{
   [super dealloc];
   [otherObject release];
}

その場合は、順序を変更してください。を呼び出す[super dealloc]と、オブジェクトがメモリから消去され、後で otherObject にアクセスしようとすると、割り当てられていないメモリにアクセスすることになります -> EXC_BAD_ACCESS.

于 2011-08-11T11:58:20.650 に答える
0

オブジェクトがどのように初期化されるかを確認しないと、誰にとっても確実に知ることは困難です。

MyObject *someObject = [MyObject alloc] init...]; // Make sure you aren't autoreleasing here
// do some stuff with someObject

[someObject release];
于 2011-08-11T18:35:05.027 に答える