我正在编写一个支持 ARC 的框架,它创建一个对象层次结构,与 Cocoa 的 View 层次结构不同。每个 Controller 对象可以有多个子 Controller 。 Controller 可能相互引用,这会带来创建保留循环的潜在风险。
我知道如何避免循环保留。我想知道是否有一种方法可以让我以编程方式检测是否存在保留循环并阻止对象解除分配?
在某些时候,现有的根 Controller 将被新的根 Controller 取代。因为我使用的是 ARC,所以我不能使用 retainCount 来检查现有 Controller 的保留计数。从我读过的内容来看,这是不可信的。
我有一个测试设置,其中根 Controller 有两个子 Controller ,每个子 Controller 都对另一个有很强的引用。在那种情况下,根 Controller 不会运行 dealloc,当根 Controller 被新 Controller 替换时,其他两个 Controller 也不会运行。不出所料。我在想,在这种情况下,应该有一些方法可以让我确定根 Controller 是否真的解除了分配。
可能的解决方案: 在替换 Controller 之前不久,我确实将要替换的根 Controller 分配给全局对象的归零弱属性。然后我设置了一个计时器,以便在几分之一秒后检查该属性是否为 nil。如果它为零,则 Controller 确实解除了分配。如果它不是零,则可能表示内存泄漏可能是由层次结构中某处的保留循环引起的。在那种情况下,只要替换的 Controller 不为零,我就会打印一条日志语句以引起开发人员的注意。
这行得通,但是否有其他(更好的)解决方案?或者此解决方案可能需要注意的事项?
具体来说,对象释放之前可以经过多少时间 - 这是否保证是即时的,或者可以延迟释放,如果可以,延迟多长时间?
最佳答案
I'm writing an ARC-enabled framework which creates a hierarchy of objects, not unlike Cocoa's view hierarchy…
停在那里。只需将该关系引入您的层次结构即可。 View 有父 View 、 subview 等——考虑它们如何交互并让彼此保持适当的长度。教你的对象他们需要的关系,并教他们如何清理自己。简化:
- (void)tearDownState
{
if (self.isTearingDown)
return;
[self setTearingDown];
for (Node * at in self.subnodes) {
[at tearDownState];
}
self.subnodes = 0;
...
然后如果你还需要交换节点(例如你的根),教他们交换节点。
关于objective-c - 以编程方式检测对象层次结构中的保留周期的策略可能是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12610644/