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

标签 xcode memory-management memory-leaks timer strong-references

作为我之前 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/

相关文章:

ios - 将 UIStackView 的内容向内移动

xcode - Cocoapods-Flurry&TestFlight-建筑的 undefined symbol

javascript - Dom Object被移除后,MS Edge的总内存使用量如何持续增长?

memory-leaks - 当循环引用的访问路径被破坏时,Java 垃圾收集器如何处理循环引用?

c++ - 关于对内存泄漏的第 3 方 DLL 进行沙盒处理

ios - 如何在不询问 iOS Swift 登录的情况下自动登录?

swift - 尝试调用长按手势并运行命令,但在函数中使用选择器时遇到 SIGABRT 错误。什么没有连接?

java - Android内存泄漏?

ruby-on-rails - 如何在 Heroku 中设置内存使用警报?

java - 创建的对象数量