减少UILabel的内存使用量

时间:2015-12-01 07:20:22

标签: ios memory uilabel

通常情况下,UILabel的内存使用率不是很大。

然而,在小部件中,它非常重要!因为我们每个iOS扩展只能使用10MB内存。

我自己可以优化所有逻辑和模型,但问题是来自Apple的UIViews

  1. 覆盖UIView的所有drawRect:都将由光栅图片支持。所以View大小对内存消耗很重要。只是容器UIView不使用栅格缓存。
  2. UILabel也支持光栅图像,因为Core Text会这样做。
  3. UILabel打破给定文本1到2的行时,即使第二行的内容非常小,它也将使用2倍的内存。因为整个内容都有光栅图像支持。
  4. iPhone6 +和iPhone6S + plus具有3倍刻度光栅图像。因此,iPhone6 +和6S +上的UILabel使用的内存比iPhone5多2.25倍,即使它们的视觉尺寸相同。 ((3 * 3)/(2 * 2))。
  5. 更重要的是,iPhoneX +拥有更宽的屏幕,因此适合屏幕宽度的UILabel的换行将导致巨大的内存消耗。因此,iPhoneX +通常比iPhone 5需要3到4倍的内存。
  6. 因此,在小部件扩展中使用多个标签对于3x缩放的iPhoneX +用户来说可能是危险的,iOS会杀死超出严格内存限制的扩展。

    我试过了:

    • 关闭光栅背景。 (没办法找到)
    • 使用低级核心文本API。 (结果相同)
    • 使用布局约束使UILabel尽可能小。 (但是,有时用户内容很重要)

    我希望通过保持显示的内容量来减少内存使用量。

    欢迎任何建议,建议和抽象策略。

1 个答案:

答案 0 :(得分:1)

我不知道您的iOS基本版本,但是如果您的 UILabel 单色,您是否更改了 CALayerContentsFormat < / strong>改为 kCAContentsFormatGray8Uint ,这意味着您将 kCAContentsFormatRGBA8Uint 改为(每像素1字节)(每像素4字节)。

迅速采样:

if #available(iOS 10.0, *) {
    label.layer.contentsFormat = .gray8Uint
}