NSMutableArray版本崩溃了我的程序 - 为什么?

时间:2012-05-27 01:51:14

标签: objective-c cocoa memory-management

我认为在发生此问题之前我已经理解了内存管理(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];
    }
}

即使我检查彩虹是否还在,但发送消息会导致该段错误。有一个地方可以使用它:它作为* info参数传递给CGShading回调函数。以下是该函数的相关位(通常可以在不崩溃的情况下工作):

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

我猜这里有关于线程的东西,但我真的不知道。有人有主意吗?非常感谢你!我重读了内存管理指南;在这个和我的玻璃桌面上的任何更多的头饰都在我脸上粉碎。

2 个答案:

答案 0 :(得分:3)

始终做

[super dealloc]

在你的dealloc方法结束时。

答案 1 :(得分:1)

除了Terry关于[super dealloc]的观点之外,-removeAllObjects调用将向数组中的所有对象发送消息(以释放它们)。如果您过度释放了这些对象中的任何一个,那么该数组所指向的指针现在可能指向已释放或无效的空间。

因此,您必须检查数组中所有对象的内存管理。在Zombies工具下运行您的应用程序。进行构建和分析并解决已发现的问题。