【问题标题】:Reduce memory usage of UILabel减少UILabel的内存使用
【发布时间】:2015-12-01 07:20:22
【问题描述】:

通常情况下,UILabel 的内存使用问题不大。

但是,在小部件中,这很重要!因为我们只能为每个 iOS 扩展使用 10MB 内存。

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

  1. 所有覆盖drawRect:UIView 都将由光栅图像支持。所以视图大小很重要内存消耗。仅容器 UIView 不使用光栅缓存。
  2. UILabel 也支持光栅图像,因为 Core Text 这样做了。
  3. UILabel 将给定文本的行从1 到2 断开时,即使第二行的内容非常少,它也会使用2 倍的内存。因为整个内容都由光栅图像支持。
  4. iPhone6+ 和 iPhone6S+ plus 具有 3 倍比例的光栅图像。所以,UILabel 在 iPhone6+ 和 6S+ 上使用的内存是 iPhone5 的 2.25 倍,即使它们在外观上大小相同。 ((3*3) / (2*2))。
  5. 更何况,iPhoneX+ 的屏幕更宽,所以适合屏幕宽度的UILabel 的换行会造成巨大的内存消耗。因此,iPhoneX+ 通常需要比 iPhone 5 多 3~4 倍的内存。

因此,在小部件扩展中使用多个标签对于 3 倍缩放的 iPhoneX+ 用户来说可能是危险的,iOS 将终止超出严格内存限制的扩展。

我试过了:

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

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

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

【问题讨论】:

  • 如果你说的是真的,Widget Extensions 已经损坏并且应该避免使用,除非你当然没有真正看到内存问题?
  • 这是真的。我确实与这个问题斗争了 2 年。您可以从stackoverflow.com/questions/28195320/…查看详细问题和我的半答案。
  • 我会转储它们;他们不值得 2 年的努力。
  • iOS 在超出设计的内存限制时终止扩展。没有崩溃报告或转储的机会,因为它不是崩溃,只是iOS正常杀死,就像iOS杀死旧的后台应用程序以确保内存一样。 Xcode 只是提醒“内存错误”而已。
  • 无论如何,这个问题的重点是减少UILabel的内存,而不是扩展限制。内存限制是合理的,我可以同意 Apple 的决定(尽可能让许多应用程序保持活力)。但是,UIKit 几乎占用了内存,这是我的问题。

标签: ios memory uilabel


【解决方案1】:

我不知道您的 iOS 基本版本,但是如果您的 UILabel单色,我有一个小技巧可以减少内存消耗,您是否更改了 CALayerContentsFormat 到 kCAContentsFormatGray8Uint 这意味着您使用(每像素 1 个字节)而不是(每像素 4 字节)与 kCAContentsFormatRGBA8Uint

快速采样:

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

【讨论】:

  • 感谢您的友好建议。使用布局配置使 UILabel 尽可能使用小区域并设置 contentsFormat 将非常有帮助 IMO。
猜你喜欢
  • 1970-01-01
  • 2013-05-21
  • 2021-06-30
  • 2011-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-19
相关资源
最近更新 更多