gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 05:10:47 27 4
gpt4 key购买 nike

作为我之前 How can I create a reference cycle using dispatchQueues? 的后续:

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

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

  • 还有其他指标吗?
  • 我知道 Xcode 直观地显示内存中某个类型的实例数。但是有没有办法过滤内存中实例超过 3 个的对象呢?

最佳答案

你问:

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] 模式或您有什么)。

如果“Debug Memory Graph”知道这些众所周知的持久对象(如主运行循环、默认通知中心、libDispatch 等),并且可能会引起我们注意这些持久对象之一的情况,那就太好了objects 是最后剩下的对我们的一个对象的强引用。但事实并非如此,至少在这一点上是这样。

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

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

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?

再一次,不,据我所知不是。

关于xcode - Xcode 内存图是否为非内存周期的强引用提供任何智能视觉指示器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56261915/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com