作为我以前的跟进,如何使用调度值创建参考周期?
对于强引用(会产生泄漏,但不是参考周期(,例如Timer
,DispatchSourceTimer
,DispatchWorkItem
,内存图没有创建紫色图标,我怀疑这仅仅是因为它找不到两个对方彼此强烈指向的对象。
我知道我可以来回观察特定类只是没有离开记忆,但是想知道Xcode是否提供了更多信息。
- 还有其他指标吗?
- 我知道Xcode可视显示内存中类型的实例数。但是,有没有办法过滤内存中有3个以上实例的对象?
你问:
对于强引用(会产生泄漏,但不是参考周期(,例如
Timer
,DispatchSourceTimer
,DispatchWorkItem
,内存图没有创建紫色图标,我怀疑这仅仅是因为它找不到两个对方彼此强烈指向的对象。
是。或更准确地说,当有两个(或更多对象(彼此之间有两个(或更多对象(时,会产生强参考周期。
但是,在重复计时器,通知中心观察者,GCD来源等的情况下,严格来说,这些不是强有力的参考周期。问题是所有者(对我们应用程序对象的强烈引用的对象(只是某些持久的对象,在我们的应用程序运行时不会发布。当然,从我们的角度来看,我们的对象可能仍然是"放弃的记忆",但这不是一个周期。
举例来说,请考虑重复对我们对象的强烈参考的计时器。主要的Runloop是对该计时器的强烈参考,直到计时器无效之前才发布。从狭窄的意义上讲,没有强大的参考周期,因为我们的应用程序没有强大的引用返回Runloop或The Timer。但是,尽管如此,重复的计时器仍将对我们的对象保持有力的参考(除非我们使用[weak self]
模式或您有什么(。
如果"调试记忆图"知道这些众所周知的持久对象(例如主跑卢普,默认通知中心,libdispatch等(,那将是可爱的,也许我们将注意力吸引到了这些持久性之一的情况下对象是我们对象之一的最后一个有力的参考。但这并没有,至少在这一点上。
这就是为什么我们采用"返回我的大多数自定义对象应该已经被划分的技术",然后"使用'调试内存图'来识别未发布的内容,并查看哪些强引用持续存在"。当然,如果Xcode可以自动引起我们的注意,那就太好了,但事实并非如此。
但是,如果我们的应用具有一些静止状态,我们知道我们的应用程序仍应存在的有限类型,那么"调试内存图"功能仍然非常有用,即使没有某些指标,例如强参考周期警告。
我知道我可以来回观察特定类只是没有离开记忆,但是想知道Xcode是否提供了更多信息。
- 还有其他指标吗?
不,我不知道。
- 我知道Xcode可视显示内存中类型的实例数。但是,是否有一种方法可以过滤在内存中有3个以上实例的对象?
再次,不,我不知道。