0

この問題が発生するまで (Mac OS X 10.6)、メモリ管理を十分に理解しているつもりでした: NSMutableArray インスタンス変数を持つカスタム NSView サブクラスがありますが、ビューの割り当てを解除してそのインスタンス変数を解放しようとすると、BOOM、EXC_BAD_ACCESS が発生することがあります。 . これは、プログラムを終了せずにドキュメント ウィンドウを閉じようとすると発生しますが、何らかの理由で、同じ条件下でも問題なく動作することがあります。ここで何が起こっているのかを理解してくれる人はいますか? 私の NSView サブクラスからの関連するコードのビット:

- (id)initWithFrame:(NSRect)frame {
    self = [super initWithFrame:frame];
    if (self) {
        rainbow = [[NSMutableArray alloc] initWithObjects:
            // some objects go here, followed by the nil sentinel
            ]
        return self;
    }
    return nil;
}

そして、dealloc メソッド:

- (void)dealloc {
    [super dealloc];
    NSLog(@"Release the rainbow!");
    if (rainbow) {
        [rainbow removeAllObjects]; // EXC_BAD_ACCESS happens here
        [rainbow release];
    }
}

虹がまだあるかどうかを確認しても、メッセージを送信すると、そのセグメンテーション違反が発生します。使用される場所が 1 つあります。*info 引数として CGShading コールバック関数に渡されます。その関数の関連部分を次に示します (通常、クラッシュすることなく動作します)。

NSMutableArray *colorStops = (NSMutableArray *)info;
[colorStops retain];
/*
    ...
*/
[colorStops release];

ここにスレッドに関する何かがあると推測していますが、実際にはわかりません。誰にもアイデアはありますか?どうもありがとうございました!メモリ管理ガイドを読み直しました。これ以上のヘッドデスクと、私のガラスのテーブルトップが私の顔に粉々になります。

4

2 に答える 2

3

いつもする

[super dealloc]

dealloc メソッドの最後に。

于 2012-05-27T01:53:02.023 に答える
1

In addition to Terry's point about [super dealloc], the -removeAllObjects call will message all of the objects in the array (to release them). If you have overreleased any of those objects, the pointer that the array has may now point to deallocated or otherwise invalid space.

So, you have to review your memory management of all of the objects in the array. Run your app under the Zombies instrument. Do a Build and Analyze and resolve the identified issues.

于 2012-05-27T02:49:14.043 に答える