我有一个启用了 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
那么我偶尔会遇到上述崩溃。我强调“偶尔”,因为它并不总是发生。