首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关联视图消失后调用的CATiledLayer drawInContext

关联视图消失后调用的CATiledLayer drawInContext
EN

Stack Overflow用户
提问于 2010-10-27 08:27:27
回答 4查看 2.1K关注 0票数 4

今天我遇到了一个涉及CATiledLayer的有趣的iOS问题。这只会在设备上发生-不会在模拟器中发生。

我的视图通过drawLayer: inContext: CALayer回调来绘制它的委托。该层有一个从CATiledLayer派生的子层,它在覆盖的drawInContext:方法中执行自己的绘制。

两个层都通过CGContextDrawPDFPage()呈现pdf内容。( CALayer绘制低分辨率版本,而CATiledLayer子层在顶部绘制高分辨率内容。)

我遇到了一个场景,我将完成视图-从它的superview中删除它,并释放它。在视图上调用dealloc()。稍后,CATiledLayer的drawInContext:方法将被系统调用(在后台线程上)。它会绘制,但从方法返回时Springboard会崩溃,在这样做的过程中,我的应用程序也会崩溃。

我在CATiledLayer中设置了一个标志,告诉它不要再渲染视图的dealloc方法,从而修复了这个问题。

但我只能想象有一种更优雅的方式。为什么在父层之后仍然调用CATiledLayer drawInContext:方法,并且父层的视图被释放?关闭视图的正确方法是什么,这样就不会发生这种情况?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-03-31 23:29:42

代码语言:javascript
复制
-(void)drawLayer:(CALayer *)calayer inContext:(CGContextRef)context {    
   if(!self.superview)
      return;
   ...

更新:在我的记忆中,当涉及到CATiledLayers时,这在旧版本的iOS中是有问题的,但是现在在dealloc之前将委托设置为nil是可行的。请参阅:https://stackoverflow.com/a/4943231/2882

票数 0
EN

Stack Overflow用户

发布于 2011-08-12 17:30:01

最慢但最好的修复方法是也设置view.layer.contents = nil。这将等待线程完成。

票数 10
EN

Stack Overflow用户

发布于 2011-02-09 17:53:12

在释放视图之前,将view.layer.delegate设置为nil。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4029096

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档