CALayer renderInContext: Crash

记录一个问题, CALayer renderInContext: 在 iOS 8 或者 iOS9 上可能会导致崩溃。
复现步骤,当对一个 view 的 layer 执行 renderInContext: 方法时,如果该 view 的 layer 树的子图层树中有 frame 为 CGRectNULL 或者 position (frame.origin.x / frame.origin.y)中有 INFINITY 的时候, 会导致崩溃。

在 iOS 8 上会导致:
Assertion failed: (transform_is_valid(m)), function CGPathRef CGPathCreateWithRect(CGRect, const CGAffineTransform *), file Paths/CGPath.cc, line 179.

在 iOS 9 上会导致:

2017-09-13 16:34:58.335 UIKitTest[9443:271781] *** Terminating app due to uncaught exception 'CALayerInvalidGeometry', reason: 'sublayer with non-finite position [inf inf]' *** First throw call stack: ( 0 CoreFoundation 0x000000010bf15d85 __exceptionPreprocess + 165 1 libobjc.A.dylib 0x000000010b989deb objc_exception_throw + 48 2 CoreFoundation 0x000000010bf15cbd +[NSException raise:format:] + 205 3 QuartzCore 0x000000010ca8a9ee -[CALayer _renderSublayersInContext:] + 550 4 QuartzCore 0x000000010ca88dee -[CALayer renderInContext:] + 990 5 QuartzCore 0x000000010ca8a9be -[CALayer _renderSublayersInContext:] + 502 6 QuartzCore 0x000000010ca88dee -[CALayer renderInContext:] + 990 7 QuartzCore 0x000000010ca8a9be -[CALayer _renderSublayersInContext:] + 502 8 QuartzCore 0x000000010ca88dee -[CALayer renderInContext:] + 990 ...

如果对 UIView 做截图,可以使用如下方法,自测不会 Crash.
-[UIView drawViewHierarchyInRect:appDelegate.window.bounds afterScreenUpdates:];

总结: 平时开发时, 我们通过计算,很难会出现 CGRectNULL 或者 Position 中出现 INFINITY 的情况, 除非通过 CGRectDivide 等调用, 可能会返回一个 CGRectNULL 但是这个时候,我们一般会对这个返回值做测试, 而 INFINITY 的话, 浮点数溢出可能产生这个值。

旁注: 如果我们计算 frame 时,设置了 NAN 或者通过某种方式产生了包含 NAN 为成员变量的 CGRect 结构体,那么在添加到 view 视图树 或者 layer 图层树中,会直接导致崩溃,这个情况比较直观。记录一下对这些边界值的测试。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 在iOS中随处都可以看到绚丽的动画效果,实现这些动画的过程并不复杂,今天将带大家一窥iOS动画全貌。在这里你可以看...
    F麦子阅读 10,541评论 5 13
  • 本文转载自:http://www.cocoachina.com/ios/20150104/10814.html ...
    idiot_lin阅读 5,521评论 0 11
  • 在iOS中随处都可以看到绚丽的动画效果,实现这些动画的过程并不复杂,今天将带大家一窥ios动画全貌。在这里你可以看...
    每天刷两次牙阅读 12,722评论 6 30
  • 7、不使用IB是,下面这样做有什么问题? 6、请说说Layer和View的关系,以及你是如何使用它们的。 1.首先...
    AlanGe阅读 4,410评论 0 1
  • 这个社会很浮躁,玩文玩的越来越多了,旨在陶冶情操修身养性!实际上是我们太浮躁了。 我们做事着急,着急要结果,只要结...
    苏骝亮阅读 2,812评论 0 1

友情链接更多精彩内容