0

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

self.contentsScale = UIScreen.mainScreen().scale

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

这会导致我的扩展在 6+ 时崩溃

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

override func drawInContext(context: CGContext) 
{            
}

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

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

这只是 iphone 6 plus 的问题

4

1 回答 1

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:or 。drawRect:除非你心里有一些特殊的文字效果,你知道没有定制的绘图代码是无法实现的,否则 iOS 提供了许多更容易使用更高性能的选项,例如UILabelCATextLayer,甚至是适当准备CAShapeLayer的 s。

于 2016-03-03T06:05:21.503 回答