在自定义 CALayer 上设置 contentsScale 后核心动画使用了太多内存

Core animation using too much memory after I set contentsScale on custom CALayer

我正在使用自定义 CALayer 为键盘扩展绘制一些 UI,我注意到在添加行

后 CoreAnimation 使用了大量内存
self.contentsScale = UIScreen.mainScreen().scale

整个应用程序的核心动画对象的总内存使用量从 4 MB 跃升至 15 MB。我通过在我的设备上进行分析并查看内存使用情况看到了这一点。

这会导致我的扩展在 6+

上崩溃

即使我实际上没有画任何东西,这也是正确的。我已经从 drawInContext 中取出所有内容,它仍然可以重现。

override func drawInContext(context: CGContext) 
{            
}

图层确实跨越了我的整个键盘,因为我想在不同的点绘制 ui 个元素,我需要设置内容比例,因为我想在图层中绘制一些文本和没有比例它看起来很模糊。

有人知道如何为此减少内存占用吗?

这只是 iphone 6 plus

上的问题

一个空的 drawInContext: 实现仍然会导致分配,因为像 -[UIView drawRect:] 方法一样,覆盖此方法会告诉 iOS 您想要进行自定义绘图,这需要后备存储分配用于存储图层的绘制结果。

假设没有进行巧妙的优化,内存中此数据的大小至少为 width of the keyboard * height of the keyboard * screen scale * color components per pixel * sizeof(CGFloat),或者对于与64 位 iPhone 6+.

值得注意的是,除非别无选择,否则应避免覆盖 drawInContext:drawRect:。除非你有一些特殊的文字效果,你知道如果没有定制的绘图代码就无法实现,iOS 提供了许多选项,这些选项更易于使用 更高的性能,例如 UILabelCATextLayer,甚至是适当准备的 CAShapeLayers.