Ita*_*vka 23 garbage-collection reference strong-references swift swift2
是否有工具或方法在我的SWIFT代码中找到强引用循环?
一个强大的引用循环是当两个类的实例相互引用而没有正确的安全性(weak/ unowned)时,因此一旦我创建的所有变量停止引用这些对象,就会阻止垃圾收集器处理它们.
Rob*_*Rob 28
查找强引用循环的方法在Swift中与在Objective-C中相同.
您可以从Xcode运行应用程序,充分运行应用程序以显示循环,然后点击"调试内存图"按钮(
).然后,您可以在左侧面板中选择未发布的对象,它将显示内存图,通常可以显示强大的参考周期:
有时候内存周期并不那么明显,但你至少可以看到哪个对象保持对相关对象的强引用.如有必要,您可以向后追踪,并确定哪些内容对此有强烈的参考,等等.
有时知道什么类型的对象保留强引用是不够的,并且您真的想知道代码中的哪个位置建立了强引用."malloc stack"选项,如/sf/answers/2169543351/所示,可用于识别建立此强引用时的调用堆栈(通常可让您识别准确的代码行)这些强有力的参考建立的地方).有关更多信息,请参阅WWDC 2016视频使用Xcode进行可视化调试.
您还可以使用Instruments来识别泄漏的对象.只需通过使用Allocations工具的应用程序运行应用程序,重复(不只是一次或两次)将应用程序恢复到稳定状态状态,如果内存继续上升,那么您可能会有一个强大的参考周期.您可以使用"分配"工具来识别未发布的对象类型,使用"记录引用计数"功能来准确识别这些强引用的建立位置等.
请参阅WWDC 2013视频修复内存问题和WWDC 2012视频iOS应用程序性能:内存,用于介绍识别和解决内存问题.现在提出的基本技术仍然适用(尽管仪器工具的UI已经发生了一些变化......如果您想要了解稍微改变的UI,请参阅WWDC 2014视频使用仪器改进您的应用程序).
另外,"垃圾收集"是指一种非常不同的存储系统,在此不适用.
小智 27
您可以将deinit函数添加到将在取消分配对象时调用的类.
如果没有调用deinit,则在您的应用程序运行时,您可以按下Debug Memory Graph按钮(在下面圈出)并检查哪些内容有参考.
使用中间窗格顶部的下拉菜单在类和类实例之间切换.
如果在没有被释放的情况下一次又一次地分配某些内容,您应该看到多个实例,并且您应该能够通过方向图看到其中一个子项是否持有对其父项的强引用.
您可以使用 Instruments来做到这一点。正如本文最后一段所说:
\n\n\n\n一旦 Instruments 打开,您应该启动您的应用程序并进行一些交互,特别是在您想要测试的区域或视图控制器中。任何检测到的泄漏都将在 \xe2\x80\x9cLeaks\xe2\x80\x9d 部分中显示为红线。助理视图包括一个区域,Instruments 将向您显示泄漏所涉及的堆栈跟踪,让您了解问题可能出在哪里,甚至允许您直接导航到有问题的代码。
\n
| 归档时间: |
|
| 查看次数: |
8709 次 |
| 最近记录: |