【问题标题】:Deinit is it a good practice to implement it on viewControllers?Deinit 在 vi​​ewControllers 上实现它是一个好习惯吗?
【发布时间】:2017-10-14 14:03:30
【问题描述】:

我想知道在每个视图控制器上实现deinit 以检查它在消失时是否被正确删除并避免内存泄漏是否是一种好习惯?

【问题讨论】:

  • 绝对不只是为了“检查一些东西”。此外,对于控制器来说,使用它们自己的生命周期方法通常是有意义的。
  • 这是测试/开发/调试的好习惯,但不适用于发布。一旦您拥有良好的“内存卫生”,那么内存泄漏应该变得很少/不存在。

标签: ios swift uiviewcontroller deinit


【解决方案1】:

默认情况下,您不必在您的类中实现deinit 方法:

Swift 自动在您的实例不再存在时解除分配 需要,以释放资源。 Swift 处理内存管理 实例通过自动引用计数 (ARC),如中所述 自动引用计数。通常您不需要执行 在您的实例被释放时手动清理。然而,当你 正在使用自己的资源,您可能需要执行一些 自己额外清理。例如,如果您创建一个自定义类 要打开文件并向其中写入一些数据,您可能需要关闭 释放类实例之前的文件。

Swift 去初始化文档 - How Deinitialization Works Section.

通常,在使用视图控制器时,似乎没有必要进行这样的实现。但是,正如@rmaddy的评论中提到的,它仍然是一种使用视图控制器跟踪内存泄漏或引用周期的方法。

如果您的目的是检查控制器是否已从层次结构中移除(查看控制器生命周期),您可以实现 viewWillDisappear(_:)viewDidDisappear(_:) 方法;请注意,调用这些方法保证deinit会被调用,也就是说,这并不意味着视图控制器的消失总是会导致它被释放(相关:Deinit never called、@987654326 @)。

还有:

这些问答应该很有用:

【讨论】:

  • tl;dr - 是的,使用deinit 是验证视图控制器没有内存泄漏或引用循环的一种方法。
【解决方案2】:

Swift 会在不再需要时自动释放您的实例,以释放资源。所以在你所有的viewControllers 上添加deinit 似乎没有必要。每当您需要在释放对象之前执行一些操作或清理时,您都应该调用 deinit

【讨论】:

    【解决方案3】:

    好吧,在测试阶段这可能是个好主意,因为您可以检查一切是否正常(例如,如果您有很多完成处理程序),但总的来说这是不必要的。

    【讨论】:

      猜你喜欢
      • 2011-08-23
      • 2016-01-03
      • 1970-01-01
      • 2019-09-27
      • 1970-01-01
      • 2011-11-15
      • 2014-12-22
      • 2020-08-25
      • 2015-05-08
      相关资源
      最近更新 更多