UIViewController在dealloc时不释放子视图(使用ARC)

时间:2012-01-13 15:57:38

标签: iphone objective-c ios automatic-ref-counting

我对UIViewController有一个奇怪的(非?)问题。看来控制器在取消分配时不会释放其子视图。我将NSLog消息放在所有子视图的dealloc方法以及视图控制器中。视图控制器dealloc被调用,但子视图没有。但是,如果我然后将该视图控制器的另一个实例推送到导航堆栈,则会显示之前实例的所有子视图都会被释放(我在控制台中收到一堆NSLog消息让我知道)。我已经检查过,并且我没有单独引用显示视图控制器中的自定义视图控制器(正在进行推送的那个)。

一个小(可能)细节:自定义视图控制器确实接收它存储的块,然后在弹出之前执行。但是,我确实发送了nil并且我得到了同样的行为。另外,当弹出堆栈时,呈现视图控制器会释放dealloc,因此没有保留周期。

另外,我确实尝试在自定义视图控制器的dealloc方法中显式释放每个视图。同样的行为。

导航控制器是否有可能坚持下去?它似乎不会对我的任何其他视图控制器执行此操作。

我的问题是,这确实代表了内存泄漏(所有这些子视图);虽然泄漏没有堆积,但它仍然是泄漏。

3 个答案:

答案 0 :(得分:7)

好的,这很令人尴尬。我确实在另一个类(称为ViewDef)中发现了问题,我无意中将其用作集合类。当我第一次搞清楚一些动画时(几个月前),这是一种快速而肮脏的方式来跟踪我的子视图。 ViewDef存储了从数据库中检索到的frame / font / color / etc信息,因此在计算动画时(在方向之间)也可以方便地存储视图。这些ViewDef由我的模型存储并传递,因此当然也保留了视图(稍后由另一个视图控制器替换)。无论如何,我忘了在我的代码中插入警告以便稍后解决此问题。

故事的道德:如果你打算做一些愚蠢的事情,至少记录你的愚蠢,这样你就不必在以后通过互联网广播。

答案 1 :(得分:0)

您可以尝试在viewDidUnload方法中将子视图设置为nil,这可能会有所帮助

答案 2 :(得分:0)

要尝试的一件事是确保所有子视图委托都设置为nil。