通过单个单元测试取消Swift中的保留周期

不敢相信我们在2017年仍在处理这个问题吗? 好吧,这使我们两个人成为了现实。 尽管保留周期很容易修复,但是在关注代码库时也很难发现它们。 最近,我发现单个单元测试可以提供安慰。 仅需几行代码,它就可以在您进行更改时连续运行,同时还可以确保您没有引入任何新的内存泄漏。

这是一个简单的代码段,但我将带您逐步了解。

测试函数利用XCTest的异步期望系统来获取是否调用了类的deinit函数。 您需要的子类化技巧是必需的,因为Swift尚不支持反射。 子类通过添加deinitCalled闭包来跟踪deinit调用。

该测试通过在主队列上分配实例,同时立即在后台队列上分配实例来进行工作。 这将触发deinit调用,并且测试成功。

如果由于5秒超时而导致测试失败,这就是提示。 您刚刚发现了一个保留周期! 我发现在整个开发过程中运行此测试会有所帮助。 代码更改之间的差异仍然很小,足以使您忘记[weak self][unowned self]

PS我无法找到使测试功能通用的方法,因此我一直在复制粘贴它。 我意识到这并不理想。 但是,我发现这没什么大不了的,因为我们正在处理测试代码,而不是实际的应用程序代码。