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

标签 objective-c cocoa memory-management

我以为我对内存管理有足够的了解,直到这个问题发生(Mac OS X 10.6):我有一个带有 NSMutableArray 实例变量的自定义 NSView 子类,但是当我解除分配我的 View 并尝试释放该实例变量时,有时 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];
    }
}

即使我检查 Rainbow 是否仍然存在,向其发送消息也会导致该段错误。它有一个地方被使用:它作为 *info 参数传递给 CGShading 回调函数。以下是该函数的相关部分(通常不会崩溃):

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

我猜这里有一些关于线程的东西,但我真的不知道。有人有主意吗?非常感谢!我重读了内存管理指南;再多加一点头枕,我的玻璃桌面就会在我脸上碎裂。

最佳答案

永远这样做

[super dealloc]

在 dealloc 方法的末尾。

关于objective-c - NSMutableArray 版本使我的程序崩溃——为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10771096/

相关文章:

cocoa - 清理 NSDocument 子类

objective-c - 尝试实现OpenGL画笔

iphone - 如何获得真实设备的方向?

ios: UIScrollView scrollRectToVisible 不工作

macos - 如何让 OSX 上的 WebView(或 WKWebView)在 Mojave 中采用深色模式

iphone - UItextView 委托(delegate)方法未在 subview 内调用

memory-management - Linux 中 APIC 函数的帮助

c++ - 如何使用 std::scoped_allocator_adapter?

c# - 使用 block 与功能 block

c# - 将 Objective C 转换为 C# - 此代码的等效项是什么?