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

标签 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 上的问题

最佳答案

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

假设没有进行巧妙的优化,内存中数据的大小至少为键盘宽度 * 键盘高度 * 屏幕比例 * 每个像素的颜色分量 * sizeof(CGFloat)375 * 216 * 3 * 4 * 8 = ~7mb 对于与 64 位 iPhone 6+ 上的原装键盘尺寸相同的键盘。

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

关于ios - 在自定义 CALayer 上设置 contentScale 后,核心动画使用了太多内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35755949/

相关文章:

IOS facebook app 滑动选项菜单

ios - Storyboard UICollectionViewCell 出现,然后变为空白

Swift 4 - 为多个按钮创建通用功能

ios - setNeedsDisplayInRect : causes the whole view to be updated

ios - performSelector:withObject:afterDelay 在 CALayer 动画结束后调用

iOS 结果类型 'Element' 与预期类型不匹配(Swift - Coredata)

ios - 如何从 swift 4 上的 didFinishLaunchingWithOptions 获取 Notificationcenter 数据

ios - UICollectionView 自动调整大小会导致错误

xcode - 如何检测 UITextField 中的阿拉伯字符?

ios - 正确屏蔽 CALayers