【问题标题】:Deallocation of controller instantiated using storyboard使用情节提要实例化的控制器的释放
【发布时间】:2014-06-02 03:43:26
【问题描述】:

我正在使用instantiateViewControllerWithIdentifier 实例化一个视图控制器。当我在 ARC 设置中将 nil 分配给 VC 变量时,我是否必须期望它完全释放,否则故事板会保留它?

我正在使用 presentViewController 模态呈现视图控制器,然后在 vc 中将其关闭。但是,我没有看到正在调用 vc 的 dealloc 方法。

更新:

UIStoryboard *sb = [UIStoryboard storyboardWithName:@"Main" bundle:NULL];
RViewControllerEx *viewController = (RViewControllerEx *)[sb instantiateViewControllerWithIdentifier:@"SB_RDVC"];
[self presentViewController:viewController animated:YES completion:nil];
  • 我在 -dealloc 方法中有 NSLog 来确定它是否被调用
  • 我正在使用局部变量,它没有立即解除分配

【问题讨论】:

  • 不,情节提要不保留对您的控制器的引用。如果您将其关闭,并且自己没有任何强引用,则应在关闭动画完成后将其释放。
  • @rdelmar 是否有可能该视图控制器中的某些内容无法释放?例如保留自我超过要求等。
  • 您是否有任何计时器正在运行,或任何其他长时间运行的进程?
  • 嗯,那部分超出了我正在管理的代码,但我注意到有计时器,调度队列。
  • 计时器保留它们的目标,所以如果你有重复运行的计时器,那么这将导致控制器被保留。您可以使 viewDidDisappear 上的任何计时器失效。

标签: ios objective-c memory-management uiviewcontroller automatic-ref-counting


【解决方案1】:

您没有提供足够的信息。你在用ARC吗?您是使用局部变量来保存指向 VC 的指针还是实例变量?

您如何得出没有调用模态 VC 的 dealloc 的结论?

如果您使用强局部变量实例化您的 VC,然后调用 presentViewcontroller:animated:completion:,则呈现视图控制器将在显示时保持对您的 VC 的强引用。 (您需要使用强局部变量,否则新创建的 VC 将在您创建后立即被释放。

一旦模态被解除,呈现的视图控制器将清除它的强引用,并且模态应该被释放。

【讨论】:

  • 是的,我正在使用 ARC。请参阅更新的问题。我只怀疑instantiateViewControllerWithIdentifier 保留了我的 VC,但不确定如何轻松检查。
  • 不,instantiateViewControllerWithIdentifier 将返回一个自动释放的对象。 presentViewcontroller:animated:completion: 方法将保持对您的视图控制器的强引用。
  • @Duncan 那么当视图被关闭时它会被释放吗?
  • 是的,如果您没有对它的任何强引用。您确实需要阅读 ARC 内存管理。
【解决方案2】:

Dealloc 不会立即被调用。使用 ARC,系统将在需要时自动清理不再使用的视图。

在您的情况下,一旦视图被关闭,它将一直存在,直到系统需要空间。

根据您在 dealloc 中尝试/需要做的事情,有一些解决方案(如果有兴趣,请发布您的需求)

【讨论】:

  • 我项目中的所有视图控制器都会立即调用它。
  • 我可能是错的,但就像我说的那样,我相信而且根据我的经验,情况并非总是如此。如果您需要在视图被关闭后立即执行某些操作,则可以选择。但如果不是,我相信你可以让 ARC 做它的事。
  • 每次我展示我的视图控制器时,分配的内存总是在增加,并且永远不会减少到百兆字节。我确定在我的情况下应该调用 dealloc。
  • 所以发布你的代码,连同声明实例变量/属性的部分 .h 文件,你用来保存对这个 VC 的引用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-02-07
  • 1970-01-01
  • 2013-03-03
  • 1970-01-01
  • 1970-01-01
  • 2017-03-29
  • 1970-01-01
相关资源
最近更新 更多