2012-07-29 87 views
0

我有一个启用ARC的Cocoa应用程序。我正在使用OS 10.8和Xcode 4.4。该应用程序崩溃偶尔在通话CGLayerRelease,倾销的消息像下面这样安慰: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]; 
} 

而且属性setter现在里面

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

如果我取消拨打CGLayerRelease,然后我偶尔得到上面提到的崩溃。我强调“零星”,因为它并不总是发生。

+0

可能会显示一些导致问题的代码? – Vladimir 2012-07-29 14:55:25

回答

0

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

你的CGLayer代码很可能是很好的,而且它是另外一种类似于你添加到CGLayer的CGPath。将所有ivars移至访问器。否则,你将永远追逐这类错误。