我正在使用自定义 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 您想要进行自定义绘制,这要求分配一个后备存储来存储图层绘制的结果。
假设没有进行巧妙的优化,内存中数据的大小至少为键盘宽度 * 键盘高度 * 屏幕比例 * 每个像素的颜色分量 * sizeof(CGFloat)
或 375 * 216 * 3 * 4 * 8 = ~7mb
对于与 64 位 iPhone 6+ 上的原装键盘尺寸相同的键盘。
值得注意的是,除非没有其他选择,否则应避免重写 drawInContext:
或 drawRect:
。除非您心中有一些特殊的文本效果,并且您知道如果没有定制的绘图代码就无法实现,否则 iOS 提供了许多更易于使用且性能更高的选项,例如 UILabel
、CATextLayer
,甚至正确准备的 CAShapeLayer
。
关于ios - 在自定义 CALayer 上设置 contentScale 后,核心动画使用了太多内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35755949/