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];
    }
}

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

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

我猜这里有一些关于线程的东西,但我真的不知道。有人有想法么?非常感谢!我重读了内存管理指南;再把这个放在头顶上,我的玻璃桌面就会在我脸上碎裂。

4

2 回答 2

3

总是做

[super dealloc]

在您的 dealloc 方法结束时。

于 2012-05-27T01:53:02.023 回答
1

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

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

于 2012-05-27T02:49:14.043 回答