0

我有一个启用了 ARC 的 Cocoa 应用程序。我正在使用 OS 10.8 和 Xcode 4.4。该应用程序在调用 CGLayerRelease 时偶尔会崩溃,将以下消息转储到控制台:

error for object 0x10a2d2000: entry for pointer being freed from death-row vanished

如果我注释掉对 CGLayerRelease 的调用,崩溃就会停止。我需要在启用 ARC 的项目中调用 CGLayerRelease 吗?文档对此不是很清楚。

很难为此发布代码,因为它分布在一个从 NSView 继承的类的大文件中。该类有一个数据成员CGLayerRef layer;。然后在drawRect函数内部:

    if (layer == nil) {
        layer = CGLayerCreateWithContext(context, self.frame.size, NULL);
        // draw some stuff into CGLayerGetContext(layer)
    }
    CGContextDrawLayerInRect(context, self.bounds, layer);

该类也是其窗口的委托,具有以下功能

- (void)windowDidEndLiveResize:(NSNotification *)notification {
    if (layer) {
        //CGLayerRelease(layer);
        layer = nil;
    }
    [self setNeedsDisplay:YES];
}

也在属性设置器中

- (void)setPitch:(NSArray *)aPitch {
    pitch = aPitch;
    if (layer) {
        //CGLayerRelease(layer);
        layer = nil;
    }
}

现在,如果我取消对调用的注释,CGLayerRelease那么我偶尔会遇到上述崩溃。我强调“偶尔”,因为它并不总是发生。

4

1 回答 1

0

是的,您需要在 ARC 中调用 CGLayerRelease()。上面的作业看起来是正确的,但我怀疑你可能还有其他作业。您正在直接访问您的 ivars,这是导致此类崩溃的第一大原因。除了 init 和 dealloc 之外,不要访问您自己的 ivars。为正确释放旧的访问器创建一个访问器setLayer:并创建一个新的访问器并始终使用它。

很有可能您的 CGLayer 代码很好,并且它是您添加到 CGLayer 的其他类似 CGPath 的东西。将所有 ivars 移至访问器。否则你将永远追逐这些类型的错误。

于 2012-07-31T00:10:38.197 回答