0

在我正在开发的应用程序中,我们有时会在网络请求的完成部分遇到随机崩溃。

事件链如下:

  1. 添加一个视图控制器作为子 VC。父母注册为孩子的代表。
  2. 孩子调用委托方法来调用一些API。
  3. 父级在主队列上获取响应 JSON 数据。
  4. 父级根据接收到的数据更新子级中的视图作为完成。

然而,在最后一部分,崩溃是随机发生的。它很难重现,Crashlytics 显示崩溃的发生是由于引用了一个 nil 变量,即子视图控制器的视图层次结构中的一个子视图。此时父母还活着。

不是在调用子视图控制器的函数时崩溃,而是在引用函数内部的视图时崩溃,所以我唯一的猜测是视图在子视图控制器之前被释放。

所以我的问题是,正如标题所说,视图控制器是否有可能或预期会超过它的视图?

这是文件中所说的UIViewController

视图控制器是其视图及其创建的任何子视图的唯一所有者。它负责创建这些视图并在适当的时候放弃它们的所有权,例如当视图控制器本身被释放时。

我一直认为视图被释放是因为视图控制器的引用计数为 0。

更新而不是呈现,我将它添加为子视图控制器。添加了对所发生情况的更详细说明。

4

1 回答 1

0

问题不在于您的 View Controller 比 View 寿命长,而是它的事实是,一旦调度了 Queue 即闭包或块(在您的情况下是 API 调用方法的回调),系统就会使其保持活动状态并保持强引用即使关闭或块的所有者(在您的情况下是您的视图控制器)被释放。因此,对于解决方案,您可以在闭包或块中使用弱自我。

于 2016-11-04T07:10:10.867 回答