2

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

4

3 回答 3

5

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

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

Swift Deinitialization Documentation - Deinitialization 的工作原理部分。

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

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

还:

这些问答应该很有用:

于 2017-10-14T14:19:05.997 回答
1

Swift 会在不再需要时自动释放您的实例,以释放资源。因此,添加deinit所有您viewControllers似乎没有必要。在解除分配对象之前,您应该deinit在需要执行某些操作或清理时调用。

于 2017-10-14T14:08:22.690 回答
1

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

于 2017-10-14T14:14:10.963 回答