Objective c 以编程方式检测对象层次结构中的保留周期的策略可能是什么?

Objective c 以编程方式检测对象层次结构中的保留周期的策略可能是什么?,objective-c,memory-leaks,automatic-ref-counting,retaincount,retain-cycle,Objective C,Memory Leaks,Automatic Ref Counting,Retaincount,Retain Cycle,我正在编写一个支持ARC的框架,它创建了对象的层次结构,与Cocoa的视图层次结构没有什么不同。每个控制器对象可以有多个子控制器。控制器之间可能相互引用,这可能会造成创建保留周期的潜在风险 我知道如何避免循环。我想知道是否有一种方法可以让我通过编程来检测是否存在保留周期并阻止对象取消分配? 在某个时刻,现有的根控制器将被新的根控制器替换。因为我使用的是ARC,所以无法使用retainCount检查现有控制器的retain计数。从我所读到的来看,这是不可信的 我有一个测试设置,根控制器有两个子控制

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

我知道如何避免循环。我想知道是否有一种方法可以让我通过编程来检测是否存在保留周期并阻止对象取消分配?

在某个时刻,现有的根控制器将被新的根控制器替换。因为我使用的是ARC,所以无法使用retainCount检查现有控制器的retain计数。从我所读到的来看,这是不可信的

我有一个测试设置,根控制器有两个子控制器,每个子控制器都有一个对另一个的强引用。在这种情况下,根控制器不运行dealloc,当用新控制器替换根控制器时,其他两个控制器也不运行dealloc。正如所料。我在想,在这种情况下,应该有办法确定根控制器是否真的解除分配

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

这是可行的,但是否有其他(更好的)解决方案?或者此解决方案可能的注意事项

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

我正在编写一个支持ARC的框架,它创建了一个对象层次结构,与Cocoa的视图层次结构没有什么不同

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

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

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

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

我关心的是用户代码。用户可以编写节点的子类,让我们称它们为A和B。在A中,他给B分配了一个强引用,在B中,他做了同样的事情,并且对A有一个强引用。在我的框架中,我无法阻止或清除这些,因为我不知道这种连接。但是如果我理解正确,你是说我应该添加一些共享节点的方法(即每个节点中的“朋友节点”的数组/dict),这样用户就不必创建手动连接了?但如果他还是这样做了呢?@LearnCocos2D a)视图也可能是子类的。视图也可能在其图形b)右侧之外被引用,就像视图对其子视图具有强引用一样。当客户端在维护这些强引用方面做得不好时,可能会引入泄漏和循环引用——就像视图中的控制器一样(它会引入额外的步骤来方便地构造和破坏它们的状态)。这应该是cocoa开发人员的常识——您不必实现垃圾收集器。(续)@learncos2d另一种选择是完全从客户端抽象节点,这样他们甚至不知道节点的存在。然后,您可以消除它们引用或从节点派生的可能性。最大的问题是它很容易被忽略。可能会引起最奇怪的虫子。尽早检测保留周期是至关重要的,如果框架能够进行检测(而不是清理!),那么我很高兴。现在,弱属性+计时器解决方案似乎工作得很好。@learncos2d好的,我真的不知道除了定义良好的语义和错误检测之外,还有什么要告诉你的是opt-in。您需要编写一些更强大、更具确定性的程序来证明bug的存在,并对用户将如何或可能如何使用该程序来补充和加强这一点进行充分的预见和理解。这些细节不在OP中。如果不知道您的程序打算在什么环境下运行,就可以说您提出的解决方案具有误报和否定的能力;甚至你的(续)