Objective c NSMutableArray版本使我的程序崩溃--为什么?

Objective c NSMutableArray版本使我的程序崩溃--为什么?,objective-c,cocoa,memory-management,Objective C,Cocoa,Memory Management,在出现这个问题之前(Mac OS X 10.6),我一直认为我对内存管理的理解很好:我有一个带有NSMutableArray实例变量的自定义NSView子类,但当我解除锁定视图并尝试释放该实例变量时,有时会出现BOOM,EXC_BAD_访问。当我试图在不退出程序的情况下关闭文档窗口时会发生这种情况,但由于某些原因,即使在相同的条件下,有时它也能正常工作。有人能帮我理解这里发生了什么吗?my NSView子类中的相关代码位: - (id)initWithFrame:(NSRect)frame {

在出现这个问题之前(Mac OS X 10.6),我一直认为我对内存管理的理解很好:我有一个带有NSMutableArray实例变量的自定义NSView子类,但当我解除锁定视图并尝试释放该实例变量时,有时会出现BOOM,EXC_BAD_访问。当我试图在不退出程序的情况下关闭文档窗口时会发生这种情况,但由于某些原因,即使在相同的条件下,有时它也能正常工作。有人能帮我理解这里发生了什么吗?my 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;
}
和dealoc方法:

- (void)dealloc {
    [super dealloc];
    NSLog(@"Release the rainbow!");
    if (rainbow) {
        [rainbow removeAllObjects]; // EXC_BAD_ACCESS happens here
        [rainbow release];
    }
}
尽管我检查了彩虹是否还在,但向它发送消息会导致该故障。有一个地方可以使用它:它作为*info参数传递给cgding回调函数。以下是该函数的相关部分(通常不会崩溃):

我猜这里有些关于线程的东西,但我真的不知道。有人有什么想法吗?非常感谢你!我重读了《内存管理指南》;如果再在这上面摆弄床头桌,我的玻璃桌面就会在我脸上粉碎。

总是这样

[super dealloc]
在您的解除锁定方法结束时。

始终这样做

[super dealloc]

在dealloc方法的末尾。

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


因此,您必须检查阵列中所有对象的内存管理。在僵尸工具下运行你的应用程序。进行构建、分析并解决已识别的问题。

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


因此,您必须检查阵列中所有对象的内存管理。在僵尸工具下运行你的应用程序。进行构建,分析并解决已识别的问题。

并且无需释放对象,它们将自动从阵列中移除,并在阵列释放时释放……这很有效。(:谢谢!我没有考虑到dealloc的顺序会影响子类的实例变量。对timthetoolman来说,这一行只是因为我最初认为dealloc的问题与数组中的对象有关;谢谢你注意到了。我刚刚删除了它。没有必要释放该对象s、 它们将自动从阵列中移除,并在阵列释放时释放……这很有效。(:谢谢!我没有考虑到dealloc的顺序会影响子类的实例变量。对timthetoolman来说,这一行之所以出现,是因为我最初认为dealloc的问题与数组中的对象有关;谢谢你注意到了。我刚刚删除了它。