Ios 如何修复导致子视图';不打电话给谁?

Ios 如何修复导致子视图';不打电话给谁?,ios,cocoa-touch,Ios,Cocoa Touch,我有一个视图控制器,它实例化了一堆UIButton子类,并将它们添加到它的self.view和一个可变数组中。这些子类又有一个retain属性,它指向另一个视图。在大多数情况下,view属性指向UIButton子类的superview(视图控制器的self.view,它们被添加到该视图中)。但不总是,也不一定,这就是为什么我使用这个属性,而不是继承的superview属性 我遇到的问题是,当视图控制器的dealloc执行以下操作时: - (void)dealloc { [UIBUttonSu

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

我遇到的问题是,当视图控制器的dealloc执行以下操作时:

- (void)dealloc
{
  [UIBUttonSubClassesArray release];
  [super dealloc];
}
未调用UIButton子类的dealloc。因此,这些子类中视图属性的附加版本不会被调用,而且,即使在解除分配视图控制器时,我也会为这些UIButton子类中的每个子类泄漏视图控制器的视图一次

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


有什么想法吗?

如果您的viewcontroller不在保留周期内,您可以通过将按钮中的额外保留属性设置为零,在其dealoc(以及viewDidUnload)中打破该周期


尽管一开始最好不要创建保留循环,但在您的问题中,我看不到足够的线索来说明在您的情况下应该如何避免它们。

显然没有弧,所以您是完全释放按钮,还是仅仅释放阵列?按钮引用的除了superview之外的其他视图是什么?@CodaFi no arc right。当我在数组上调用release时,应该释放这些按钮(数组应该在它们上调用release)。在发布之前,我还尝试调用removeAllObjectsarray@VadimYelagin在这一点上,只有他们的超视界才是真正的。这就是为什么我最终放弃了整个视图属性方法,而使用了superview继承的方法。但问题是,这些按钮在概念上是精灵,其Calayer是动画的,并且可能还有一个触发器(这就是为什么它们是UIButton子类)。然后,“视图”属性允许触发器以特定的方式设置不同层的动画,以避免视图控制器本身被保留。它的观点是正确的。正如我所说,我这样做只是因为按钮可能引用控制器主视图以外的其他视图。但是将属性设置为nil显然也会使应用程序崩溃。。。奇怪的在任何情况下,在这一点上,我摆脱了属性,我使用继承的superview一个视图属性指向控制器的视图