4

我正在编写一个支持 ARC 的框架,它创建对象层次结构,与 Cocoa 的视图层次结构不同。每个控制器对象可以有多个子控制器。控制器可能相互引用,这会带来创建保留周期的潜在风险。

我知道如何避免保留周期。我想知道是否有办法以编程方式检测存在保留周期并防止对象释放?

在某个时候,现有的根控制器将被新的根控制器取代。由于我使用的是 ARC,因此无法使用 retainCount 检查现有控制器的保留计数。从我读过的内容来看,无论如何都不值得信任。

我有一个测试设置,其中根控制器有两个子控制器,每个子控制器都对另一个有很强的引用。在这种情况下,根控制器不会运行 dealloc,当根控制器被新控制器替换时,其他两个控制器也不会运行。正如预期的那样。我在想,在这种情况下,我应该有某种方法来确定该根控制器是否确实解除分配。

可能的解决方案:在替换控制器之前不久,我确实将要替换的根控制器分配给全局对象上的归零弱属性。然后我设置了一个计时器,以便在几分之一秒后检查该属性是否为零。如果它为零,则控制器确实解除了分配。如果它不是 nil,它可能表示内存泄漏可能是由层次结构中某处的保留周期引起的。在这种情况下,只要替换的控制器不为零,我就会打印一条日志语句以引起开发人员的注意。

这行得通,但是有没有其他(更好的)解决方案?或者这个解决方案可能需要注意什么?

具体来说,在对象解除分配之前可以经过多长时间 - 这是否保证是瞬时的,或者可以延迟解除分配,如果可以,持续多长时间?

4

1 回答 1

0

我正在编写一个支持 ARC 的框架,它创建对象的层次结构,与 Cocoa 的视图层次结构不同……</p>

停在那儿。只需将这种关系引入您的层次结构。视图有父视图、子视图等——考虑它们如何交互并使彼此保持适当的长度。教你的对象他们需要的关系,并教他们如何清理自己。简化:

- (void)tearDownState
{
  if (self.isTearingDown)
    return;

  [self setTearingDown];
  for (Node * at in self.subnodes) {
    [at tearDownState];
  }
  self.subnodes = 0;
  ...

然后,如果您还需要交换节点(例如您的根),请教他们交换节点。

于 2012-09-27T09:24:01.487 回答