0916 - Today Widget 是个孱弱的家伙

今天美好的大半天,都献给了上面的家伙。

基本上,出现这个问题主要有 2 个原因:程序闪退、内存超限。

程序闪退,看似是程序本身的问题,但实际上和 Today Widget 的生命周期有关。Today Widget 基本上是个很弱的家伙,或者说,尽量少的在 Today Widget 中做事情、尽量避免后台任务,尤其是,和 UI 相关的后台任务。因为,当后台任务终于忙完、要更新 UI 时,可能 UI 已经被系统释放了,这里自然就闪退了。

内存超限方面:

  • 内存上限是多少呢?这个苹果并没有官方文档说明。从网上搜到的资料,多数说是总内存的 1%,比如对于 iPhone 6 是 10 MB,很小的值。仅供参考。
  • 在我这边,最直接就是 Core Data 造成的。Core Data 在内存使用方面是很慷慨乃至滥用的。只要一启动,就占用 4+ MB 内存,很大了。另外,Core Data 的内存对象释放机制也很不明确,我试了网上找的很多所谓优化,并没有很明显的下降;还有很多人通过测试验证 Core Data 有 Bug
  • 还是后台任务方面。其中我有一个操作:从 CloudKit 下载数据。这在大部分情况下都是没有问题的。但,在程序最开始运行时,会从网络下载大量数据,这时程序就崩溃了。

关键的,一旦 Today Widget 崩溃,基本很难恢复(对于我的程序而言),基本只能靠重启手机来重置。一旦用户发生此类问题,会非常难受。折腾了很久,我也没有很好的解决这个问题,只是尽量降低出现的概率,继续观察吧。