好的,伙计们,你们不喜欢我之前的回答。我会重试的。
考虑以下条件:
+-------------------+
| Table View |
|+-----------------+|
|| Cell ||
||+---------------+||
||| UILabel |||
||+---------------+||
|+-----------------+|
+-------------------+
首先表格的逻辑宽度是:
- 在 iPhone 5 上为 320pt(纵向)
- 在 iPhone 6+ 上为 414pt
内容比例因子为:
- 0.5 适用于 iPhone 5
- 0.33 适用于 iPhone 6+
1pt x 1pt 的实际像素为:
- 对于 iPhone 5,(1/0.5)^2 = 4
- 适用于 iPhone 6+ (1/0.33)^2 = 9
那么,如果UILabel 适合整个设备宽度并且它的高度是 44(Apple 的 HIG 的最小可点击高度),那么实际像素是:
- 320 * 44 * 4 = iPhone 5 的 56,320 设备像素
- 414 * 44 * 9 = iPhone 6+ 的 163,944 个设备像素
因此,iPhone6+ 需要比 iPhone5 多 3 倍的缓冲区来绘制 UILabel。
但是,当小部件的内存使用量超过 10MB(经过无数次实验估计)时,就会发生内存错误。同样的限制适用于这两种设备。 Apple 未记录此限制。
请记住,在开发 iOS8 扩展程序时,您只能使用 1% 的设备内存,以防止杀死后台应用程序。这也是目前支持照片编辑扩展的应用很少的主要原因。
无论如何,需要 UI 的扩展在 iPhone 6+ 上很容易崩溃,因为每个 UI 元素所需的内存量取决于大小和内容比例。
自定义绘图会导致相同的问题,因为它需要缓冲区来绘制以优化动画和渲染。并且缓冲区的分辨率和大小在 iPhone6+ 上要大得多。
此外,通知中心本身也存在错误(泄漏),即使只是 Hello World 小部件(带有 Xcode 模板)每次显示和隐藏都会不断增加内存消耗。当最终达到 10MB 时,它将崩溃并重新加载。这就是小部件有时闪烁的原因。如果某个小部件连续崩溃 3 次,iOS 会永久禁用该小部件并显示“无法加载”。
那么,在如此恶劣的条件下,我们能做些什么呢,我为这个问题制定了一些规则。
- 不要使用实现
[drawRect:] 的自定义视图,除非它非常小。
- 尽可能缩小视图(具有自己的内容,尤其是标签)。
- 不要使用背景图片。
点击空白区域选择单元格
对于 Widget 来说这是一个很常见的问题,它与内存错误有关,所以我也在写这个:
小部件层次结构中的所有视图都倾向于具有透明背景(UIClearColor),这意味着使单元格可点击非常困难。因为当用户触摸空白区域时,不会对小部件进行整个命中测试。 (自定义命中测试只有在至少有一个superview不透明的情况下才可以应用)有一些解决方案:
- 使 UILabel 的宽度适合 Cell:不要,这会在 iPhone6+ 或更宽、更高分辨率的设备上消耗更多内存。
- 在自定义单元格上实现空
[drawRect:]。不要,这是轻敲透明控件的非常简单的解决方案,但是它需要绘图缓冲区。请记住,每个设备的缓冲区大小会有所不同。
我可以让它在没有额外内存消耗的情况下工作的唯一解决方案是将小部件背景颜色设置为黑色,alpha 为 0.01。 (它使命中测试有效)
+-------------------+
| Table View |- backgorund-color: (0, 0, 0, 0.01)
|+-----------------+|
|| Cell ||
||+---------+ ||
||| UILabel +------++- make it small as possible as you can
||+---------+ ||
|+-----------------+|
+-------------------+
请记住,只有背景颜色的容器视图不会占用缓冲内存。