作为我之前的How can I create a reference cycle using dispatchQueues?的跟进:
对于强引用(会产生泄漏,但不是引用周期),例如Timer
,DispatchSourceTimer
,DispatchWorkItem
,内存图未创建紫色图标,我怀疑这仅仅是因为它没有找到两个强烈指向对方的对象。
我知道我可以来回去观察一个特定的类只是不离开内存,而是想知道Xcode是否提供更多功能。
答案 0 :(得分:1)
您问:
对于强引用(会产生泄漏,但不是引用周期),例如
Timer
,DispatchSourceTimer
,DispatchWorkItem
,内存图不会创建紫色图标,我怀疑这仅仅是因为它没有找到两个强烈指向对方的对象。>
是的。或更准确地说,当有两个(或更多)对象之间只有强引用时,会产生强引用循环警告。
但是,在重复计时器,通知中心观察员,GCD来源等的情况下,严格来说,这些不是强大的参考周期。问题在于所有者(与我们的应用程序对象保持强烈引用的对象)只是一些持久性对象,而这些对象在我们的应用程序运行时不会被释放。当然,从我们的角度来看,我们的目标可能仍然是“被遗弃的记忆”,但这不是一个循环。
通过示例,考虑重复计时器,该计时器对我们的对象保持强烈的参考。主运行循环会牢牢引用该计时器,并且在计时器无效之前不会释放它。从狭义上讲,没有强大的参考周期,因为我们的应用没有对运行循环或计时器的强大参考。但是,尽管如此,重复计时器仍将强烈引用我们的对象(除非我们使用了[weak self]
模式或您拥有什么)。
如果“ Debug Memory Graph”了解这些众所周知的持久性对象(例如主运行循环,默认通知中心,libDispatch等),并且将我们的注意力吸引到这些持久性对象之一的情况下,那就太好了。对象是对我们的对象之一的最后一个强有力的引用。但这至少在现在还没有。
这就是为什么我们采用“返回以指出我的大多数自定义对象应该已被重新分配”的技巧,然后“使用'调试内存图'来确定哪些未被释放并查看哪些强引用仍在继续”的原因”。当然,如果Xcode能够自动吸引我们注意这些问题,那会很好,但事实并非如此。
但是,如果我们的应用程序处于静态状态,即我们知道应该仍然存在的有限类型的对象,那么即使没有诸如强参考周期之类的指标,此“调试内存图”功能仍然非常有用。警告。
我知道我可以来回去观察一个特定的类只是不离开内存,而是想知道Xcode是否提供更多功能。
- 还有其他指标吗?
不,我不知道。
- 我知道Xcode可以直观地显示内存中某个类型的实例数。但是,有没有一种方法可以过滤内存中具有3个以上实例的对象?
再次,不,不是我所知道的。