Xcode 内存图是否为非内存循环的强引用提供任何智能视觉指示器?

Does Xcode Memory graph offer any smart visual indicators for strong references that aren't memory cycles?

作为我之前 的跟进:

对于强引用(会造成泄漏,但不是循环引用),例如TimerDispatchSourceTimerDispatchWorkItem,内存图没有创建紫色图标,我怀疑这只是因为它没有找到两个强烈指向彼此的对象。

我知道我可以来回观察特定的 class 并没有离开内存,但想知道 Xcode 是否提供了更多内容。

你问:

For the strong references (that create leaks, but aren't reference cycles) e.g. Timer, DispatchSourceTimer, DispatchWorkItem, the memory graph doesn't create a purple icon, I suspect it's simply because it doesn't find two objects pointing back to each other strongly.

是的。或者更准确地说,当有两个(或多个)对象之间只有强引用时,就会产生强引用循环警告。

但在重复计时器、通知中心观察器、GCD 源等情况下,严格来说,这些都不是强引用循环。问题是所有者(保持对我们应用程序对象的强引用的对象)只是一些持久对象,当我们的应用程序 运行 时不会被释放。当然,从我们的角度来看,我们的对象可能仍然是“废弃的内存”,但它不是一个循环。

例如,考虑重复计时器,它保持对我们对象的强引用。主运行循环保持对该计时器的强引用,并且在计时器失效之前不会释放它。没有强引用循环,从狭义上讲,因为我们的应用程序没有返回到运行循环或计时器的强引用。但是尽管如此,重复计时器将保持对我们对象的强引用(除非我们使用 [weak self] 模式或您有什么)。

如果“调试内存图”知道这些 well-known 持久对象(如主运行循环、默认通知中心、libDispatch 等),并且可能会引起我们对那些情况的注意,那就太好了这些持久对象之一是对我们的对象之一的最后剩余强引用。但事实并非如此,至少在这一点上是这样。

这就是为什么我们采用“return 指出我的大部分自定义对象应该已被释放”然后“使用‘调试内存图’来识别未释放的内容和查看持久存在的强引用”。当然,如果 Xcode 可以自动将我们的注意力吸引到这些上就好了,但事实并非如此。

但是如果我们的应用程序有一些静止状态,我们知道应该仍然存在的有限类型的对象,这个“调试内存图”功能仍然非常有用,即使没有像 strong 这样的指标引用循环警告。

I know I can go back and forth and observe that a specific class is just not leaving the memory, but wondering if Xcode is providing anything more.

  • Is there any other indicator?

不,据我所知没有。

  • I know Xcode visually shows the number of instances of a type in memory. But is there a way to filter objects that have more than 3 instances in memory?

再一次,不,据我所知没有。