今天我遇到了一个涉及CATiledLayer的有趣的iOS问题。这只会在设备上发生-不会在模拟器中发生。
我的视图通过drawLayer: inContext: CALayer回调来绘制它的委托。该层有一个从CATiledLayer派生的子层,它在覆盖的drawInContext:方法中执行自己的绘制。
两个层都通过CGContextDrawPDFPage()呈现pdf内容。( CALayer绘制低分辨率版本,而CATiledLayer子层在顶部绘制高分辨率内容。)
我遇到了一个场景,我将完成视图-从它的superview中删除它,并释放它。在视图上调用dealloc()。稍后,CATiledLayer的drawInContext:方法将被系统调用(在后台线程上)。它会绘制,但从方法返回时Springboard会崩溃,在这样做的过程中,我的应用程序也会崩溃。
我在CATiledLayer中设置了一个标志,告诉它不要再渲染视图的dealloc方法,从而修复了这个问题。
但我只能想象有一种更优雅的方式。为什么在父层之后仍然调用CATiledLayer drawInContext:方法,并且父层的视图被释放?关闭视图的正确方法是什么,这样就不会发生这种情况?
发布于 2011-03-31 23:29:42
-(void)drawLayer:(CALayer *)calayer inContext:(CGContextRef)context {
if(!self.superview)
return;
...更新:在我的记忆中,当涉及到CATiledLayers时,这在旧版本的iOS中是有问题的,但是现在在dealloc之前将委托设置为nil是可行的。请参阅:https://stackoverflow.com/a/4943231/2882
发布于 2011-08-12 17:30:01
最慢但最好的修复方法是也设置view.layer.contents = nil。这将等待线程完成。
发布于 2011-02-09 17:53:12
在释放视图之前,将view.layer.delegate设置为nil。
https://stackoverflow.com/questions/4029096
复制相似问题