我今天遇到了一个有趣的 iOS 问题,涉及 CATiledLayer。这仅发生在设备上 - 而不是在模拟器中。
我的 View 通过 drawLayer: inContext: 委托(delegate)回调在其 CALayer 中绘制。这个层有一个 CATiledLayer 派生的子层,它在一个重写的 drawInContext: 方法中进行自己的绘制。
两个层都通过 CGContextDrawPDFPage() 渲染 pdf 内容。 (CALayer 绘制低分辨率版本,而 CATiledLayer 子层在顶部绘制高分辨率内容。)
我遇到了一个场景,我将完成 View - 将它从它的 super View 中删除并释放它。在 View 上调用 dealloc()。稍后,系统将调用 CATiledLayer 的 drawInContext: 方法(在后台线程上)。它会绘制,但是从 Springboard 方法返回时会崩溃,并且这样做也会关闭我的应用程序。
我通过在 CATiledLayer 中设置一个标志来修复它,告诉它不再渲染,从 View 的 dealloc 方法。
但我只能想象有一种更优雅的方式。为什么CATiledLayer drawInContext: 方法在父层之后仍然被调用,并且父层的 View 被释放?关闭 View 的正确方法是什么,以免发生这种情况?
最佳答案
-(void)drawLayer:(CALayer *)calayer inContext:(CGContextRef)context {
if(!self.superview)
return;
...
更新:我记得,当涉及到 CATiledLayers 时,旧版本的 iOS 中存在这个问题,但是现在可以在 dealloc 之前将委托(delegate)设置为 nil。参见:https://stackoverflow.com/a/4943231/2882
关于ios - CATiledLayer drawInContext 在关联 View 消失后调用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4029096/