如何修复视图保留周期导致子视图的dealloc不被调用?

时间:2012-05-09 22:43:38

标签: ios cocoa-touch

我有一个视图控制器,它实例化了一堆UIButton子类,并将它们添加到self.view和一个可变数组中。这些子类又具有指向另一个视图的retain属性。在大多数情况下,view属性指向UIButton子类的superview(视图控制器的self.view,它们被添加到它们)。但并不总是也不一定,这就是我使用这个属性而不是继承的superview的原因。

我遇到的问题是当视图控制器的dealloc执行时:

- (void)dealloc
{
  [UIBUttonSubClassesArray release];
  [super dealloc];
}

未调用UIButton子类的dealloc。因此,不会调用这些子类中view属性的附加版本,即使取消分配视图控制器,我也会为每个UIButton子类泄漏一次视图控制器的视图。

但是,如果相反我将子类的view属性设置为assign,这样我就不需要在dealloc中调用release,他们的dealloc会被调用,即使现在没有代码引用该视图,应用程序也会崩溃。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

如果你的viewcontroller不在保留周期中,你可以通过将按钮中的额外保留属性设置为nil来打破其dealloc(以及它的viewDidUnload)中的循环。

虽然最好不要首先创建保留周期,但我没有在你的问题中看到足够的线索,说明在你的情况下应该如何避免它们。