【发布时间】:2015-12-01 07:20:22
【问题描述】:
通常情况下,UILabel 的内存使用问题不大。
但是,在小部件中,这很重要!因为我们只能为每个 iOS 扩展使用 10MB 内存。
我所有的逻辑和模型都可以自己优化,但问题是苹果的UIViews。
- 所有覆盖
drawRect:的UIView都将由光栅图像支持。所以视图大小很重要内存消耗。仅容器UIView不使用光栅缓存。 -
UILabel也支持光栅图像,因为 Core Text 这样做了。 - 当
UILabel将给定文本的行从1 到2 断开时,即使第二行的内容非常少,它也会使用2 倍的内存。因为整个内容都由光栅图像支持。 - iPhone6+ 和 iPhone6S+ plus 具有 3 倍比例的光栅图像。所以,
UILabel在 iPhone6+ 和 6S+ 上使用的内存是 iPhone5 的 2.25 倍,即使它们在外观上大小相同。 ((3*3) / (2*2))。 - 更何况,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几乎占用了内存,这是我的问题。