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

时间:2016-03-02 19:04:21

标签: ios swift core-animation calayer ios-keyboard-extension

我正在使用自定义CALayer为键盘扩展绘制一些UI,我在添加行后注意到CoreAnimation的大量内存使用

self.contentsScale = UIScreen.mainScreen().scale

核心动画对象的总内存使用量从我整个应用程序的4 MB跳到最多15 MB。我通过分析设备并查看内存使用情况来看到这一点。

这导致我的扩展程序在6 +

上崩溃

即使我实际上没有画任何东西也是如此。我已经从drawInContext中取出了所有内容,它仍然会重现。

override func drawInContext(context: CGContext) 
{            
}

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

有谁知道如何减少内存占用?

这只是iphone 6 plus的问题

1 个答案:

答案 0 :(得分:0)

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

假设没有进行巧妙的优化,内存中此数据的大小至少为width of the keyboard * height of the keyboard * screen scale * color components per pixel * sizeof(CGFloat)375 * 216 * 3 * 4 * 8 = ~7mb,键盘大小与64-上的股票键盘大小相同位iPhone 6 +。

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