2

作为我之前的后续工作,如何使用 dispatchQueues 创建参考周期?

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

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

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

1 回答 1

1

你问:

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

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

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

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

如果“Debug Memory Graph”知道这些众所周知的持久对象(如主运行循环、默认通知中心、libDispatch 等),并且可能会引起我们注意这些持久对象之一是最后剩下的强引用我们的一个对象。但它没有,至少在这一点上。

这就是为什么我们采用“返回指出我的大多数自定义对象应该已被释放”的技术,然后“使用'调试内存图'来识别未释放的内容并查看持续存在的强引用”。当然,如果 Xcode 能够自动引起我们的注意,那就太好了,但事实并非如此。

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

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

  • 还有其他指标吗?

不,不是我知道的。

  • 我知道 Xcode 直观地显示了内存中类型的实例数。但是有没有办法过滤内存中超过 3 个实例的对象?

再说一次,不,不是我知道的。

于 2019-05-22T18:17:57.463 回答