如何在Swift中识别出强大的参考周期?

时间:2015-08-28 01:55:25

标签: swift reference garbage-collection swift2 strong-references

是否有工具或方法可以在我的SWIFT代码中找到强引用周期?

强引用循环是指两个类的实例在没有正确的安全性(weak / unowned的情况下相互引用的情况下),因此一旦我创建的所有变量停止引用,就会阻止垃圾收集器处理它们那些对象。

3 个答案:

答案 0 :(得分:27)

您可以在您的类中添加deinit函数,这些函数将在取消分配对象时被调用。

如果没有调用deinit,当你的应用程序正在运行时,你可以按下Debug Memory Graph按钮(在下面圈出)并检查什么是对什么的引用。

Debug Memory Graph Button

使用中间窗格顶部的下拉菜单在类和类实例之间切换。

如果在没有被释放的情况下一次又一次地分配某些内容,您应该看到多个实例,并且您应该能够通过方向图看到其中一个孩子是否持有对其父级的强引用。

答案 1 :(得分:1)

使用仪器检查是否有泄漏和记忆丧失。在仪器上的分配工具中使用标记生成(快照)。

如何使用“快照”查找内存褶皱,请参阅:bbum blog

基本上,该方法是运行Instruments分配工具,获取快照,运行代码的迭代并重复另外3到4次快照。这将指示在迭代期间分配但未释放的内存。

要弄清楚披露的结果,以查看个别分配。

如果您需要查看对象使用仪器的保留,释放和自动释放的位置:

在仪器中运行,在分配中设置“记录参考计数”(对于Xcode 5及更低版本,您必须停止记录以设置选项)。导致应用程序运行,停止录制,向下钻取,您将能够看到所有保留,发布和自动释放的位置。

答案 2 :(得分:0)

非常简单的方法是在deinitialiser中打印

deinit {
   print("<yourviewcontroller> destroyed.")
}

确保您在控制台上看到此行已打印。把deinit放在你所有的viewcontrollers中。如果你无法查看特定的viewcontroller,意味着它们是一个引用循环。可能的原因是委托强,闭包捕获自己,定时器没有被发送等等。