Deinit是在viewControllers上实现它的好习惯吗?

问题描述:

我想知道,如果它是实现每个视图控制器上的deinit检查它是否是当它消失,避免了内存泄漏正确删除一个好的做法呢?当他们不再需要,以腾出资源Deinit是在viewControllers上实现它的好习惯吗?

+0

绝对不是仅仅用于“检查某些东西”。而且,对于控制器来说,通常使用自己的生命周期方法是有意义的。 – Sulthan

+0

这是测试/开发/调试的好习惯,但不适用于发布。一旦你有良好的“记忆卫生”,那么内存泄漏应该变得罕见/不存在。 –

默认情况下,你必须实现deinit方法在你的类:

斯威夫特自动将释放你的情况下,当他们不再需要 ,以释放资源。迅速通过自动引用计数(ARC)处理 实例的存储器管理,如在 自动引用计数说明。通常你不需要当你实例释放执行 手动清除。但是,当您使用自己的资源时,您可能需要自行执行一些额外的清理。例如,如果您创建一个自定义类 打开一个文件,写一些数据,你可能需要关闭 文件中的类的实例被释放之前。

斯威夫特去初始化文件 - How Deinitialization Works节。

通常,在使用View Controllers时,似乎不需要做这样的实现。然而,如在@rmaddy的评论中提及,但它仍然是用于跟踪内存泄漏或基准周期与视图控制器的方法。

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

另外:

这些问与答&如应该是有用的:

+1

tl; dr - 是的,使用'deinit'是验证您没有视图控制器的内存泄漏或参考周期的一种方法。 – rmaddy

+0

@rmaddy谢谢你的提示,回复更新。 –

斯威夫特会自动回收您的实例。所以要添加deinit你所有的viewControllers似乎没有必要。无论何时您需要在释放对象之前执行一些操作或清理,您都应该调用deinit

那么在测试阶段,它也许好主意,因为你可以检查,如果一切都很好(比如,如果你有很多完成处理的),但总体来说是不必要的。