我正在编写一个支持 ARC 的框架,它创建对象层次结构,与 Cocoa 的视图层次结构不同。每个控制器对象可以有多个子控制器。控制器可能相互引用,这会带来创建保留周期的潜在风险。
我知道如何避免保留周期。我想知道是否有办法以编程方式检测存在保留周期并防止对象释放?
在某个时候,现有的根控制器将被新的根控制器取代。由于我使用的是 ARC,因此无法使用 retainCount 检查现有控制器的保留计数。从我读过的内容来看,无论如何都不值得信任。
我有一个测试设置,其中根控制器有两个子控制器,每个子控制器都对另一个有很强的引用。在这种情况下,根控制器不会运行 dealloc,当根控制器被新控制器替换时,其他两个控制器也不会运行。正如预期的那样。我在想,在这种情况下,我应该有某种方法来确定该根控制器是否确实解除分配。
可能的解决方案:在替换控制器之前不久,我确实将要替换的根控制器分配给全局对象上的归零弱属性。然后我设置了一个计时器,以便在几分之一秒后检查该属性是否为零。如果它为零,则控制器确实解除了分配。如果它不是 nil,它可能表示内存泄漏可能是由层次结构中某处的保留周期引起的。在这种情况下,只要替换的控制器不为零,我就会打印一条日志语句以引起开发人员的注意。
这行得通,但是有没有其他(更好的)解决方案?或者这个解决方案可能需要注意什么?
具体来说,在对象解除分配之前可以经过多长时间 - 这是否保证是瞬时的,或者可以延迟解除分配,如果可以,持续多长时间?