gpt4 book ai didi

ios - Today Widget Extension 中经常出现 "Unable to load"

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:49:14 25 4
gpt4 key购买 nike

我正在为我的应用程序制作一个今日小部件。我的小部件包含一个带有 10 个单元格的 UITableView。 (每个单元格的高度为50pt。) 功能简单。如果我触摸单元格上的按钮,从 sqlite 重新加载数据库并将它们显示在单元格上。它在模拟器和 iPhone 4s、5、5s、6 上运行良好,只有 iPhone6+ 除外。我确实删除了小部件并再次添加了 10 多次,但这对我没有帮助。我确实检查了内存和僵尸。但这稳定在 ~10M 以下并且没有泄漏。我该如何解决我的问题?

最佳答案

好的,伙计们,你们不喜欢我之前的回答。我会重试。

考虑以下条件:

+-------------------+
| Table View |
|+-----------------+|
|| Cell ||
||+---------------+||
||| UILabel |||
||+---------------+||
|+-----------------+|
+-------------------+

首先表格的逻辑宽度为:

  • iPhone 5 上 320pt(纵向)
  • 在 iPhone 6+ 上为 414pt

内容比例因子为:

  • iPhone 5 为 0.5
  • iPhone 6+ 为 0.33

1pt x 1pt 的实际像素为:

  • 对于 iPhone 5,(1/0.5)^2 = 4
  • iPhone 6+ (1/0.33)^2 = 9

如果 UILabel 适合整个设备宽度并且它的高度为 44(Apple 的 HIG 的最小可点击高度),那么实际像素为:

  • 320 * 44 * 4 = 56,320 iPhone 5 设备像素
  • 414 * 44 * 9 = 163,944 iPhone 6+ 设备像素

因此,iPhone6+ 需要比 iPhone5 多 3 倍的缓冲区来绘制 UILabel。

但是,当小部件的内存使用量超过10MB(通过无数次实验估计)时,就会发生内存错误。同样的限制适用于这两种设备。 Apple 未记录此限制。

请记住,在开发 iOS8 扩展时,为了防止杀死后台应用程序,您只能使用设备内存的 1%。这是目前很少有应用支持图片编辑扩展的主要原因。

无论如何,因此,需要 UI 的扩展在 iPhone 6+ 上很容易崩溃,因为每个 UI 元素所需的内存量取决于大小和内容规模。

自定义绘图会导致同样的问题,因为它需要缓冲区来绘制以优化动画和渲染。并且缓冲区的分辨率和大小在 iPhone6+ 上要大得多。

此外,通知中心本身也存在漏洞(泄漏),即使只是 Hello World 小部件(Xcode 模板附带)也会在每次显示和隐藏时不断增加内存消耗。当最终达到 10MB 时,它会崩溃并重新加载。这就是小部件有时会闪烁的原因。如果某个小部件连续崩溃 3 次,iOS 会永久禁用该小部件并显示“无法加载”。

那么,在这样恶劣的条件下,我们能做些什么呢,我为这个问题制定了一些规则。

  1. 不要使用实现 [drawRect:] 的自定义 View ,除非它的尺寸非常小。
  2. 使 View (具有自己的内容,尤其是标签)尽可能小。
  3. 不要使用背景图片。

点击空白区域选择单元格

对于与内存错误相关的 Widget 来说,这是一个非常常见的问题,所以我也在写这个:

小部件层次结构中的所有 View 往往具有透明背景(UIClearColor),这意味着使单元格可点击非常困难。因为当用户触摸空白区域时,不会对小部件进行完整的 HitTest 。 (自定义 HitTest 只有在至少没有一个透明的superview时才能应用)有一些解决方案:

  1. 使 UILabel 的宽度适合 Cell:不要这样做,它会在 iPhone6+ 或更宽的高分辨率设备上消耗更多内存。
  2. 在自定义单元格上实现空 [drawRect:]。不要,这是用于点击透明控件的非常简单的解决方案,但是它需要绘图缓冲区。请记住,每个设备的缓冲区大小都不同。

我可以在不消耗额外内存的情况下使其工作的唯一解决方案是将小部件背景颜色设置为具有 0.01 alpha 的黑色。 (它使 HitTest 有效)

+-------------------+
| Table View |- backgorund-color: (0, 0, 0, 0.01)
|+-----------------+|
|| Cell ||
||+---------+ ||
||| UILabel +------++- make it small as possible as you can
||+---------+ ||
|+-----------------+|
+-------------------+

请记住,只有背景色的容器 View 不会占用缓冲区内存。

关于ios - Today Widget Extension 中经常出现 "Unable to load",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28195320/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com