UIView 未正确释放

Posted

技术标签:

【中文标题】UIView 未正确释放【英文标题】:UIView not being released correctly 【发布时间】:2011-05-10 03:54:21 【问题描述】:

我有大量的视图/视图控制器层次结构。 在主控制器中,我有以下代码,其中 aViewController 是 MyClass 的成员:

@implementation MyClass

...

- (void) viewDidLoad

    [self.view addSubview:aViewController_.view];
    [aViewController_ setDataSource:self];
    [aViewController_ setDelegate:self];


- (void)dealloc 

    //[aViewController_.view removeFromSuperview]; // All ok when this is added
    [aViewController_ release];
    [super dealloc];


...

@end

运行此程序时,我看到 aViewController 从未被释放 - 最后保留计数仍为 1。 如果howeevr 我添加[aViewController_.view removeFromSuperview]; 来解除分配一切正常。

这是为什么? [super dealloc] 不应该负责视图的发布吗?在控制器之后释放视图是否重要?

我试图用一个简单的测试应用程序进行重现,但没有任何运气。

【问题讨论】:

我认为 [super dealloc] 将负责删除您的视图。但由于它是最后调用的,所以您无法正确检查 aViewController_.view 的保留计数。 [super dealloc] 将在父类上调用 dealloc,以便它可以进行任何需要做的清理工作。属性“view”如果被保留在其他地方(由超级视图)可能不会因为控制器已被释放而从其超级视图中删除。 当不完全清楚谁分配了 ViewController_ 时,很难给出答案。您能否更新您的问题以包含此信息? 正如我所写的那样——我还认为 [super dealloc] 应该处理这个问题,但在 Instruments 中我看到的不是——并且所描述的修复解决了这个问题。我只是不明白为什么...... 【参考方案1】:

这是将您的视图添加为 aViewController_.view 的子视图。

[self.view addSubview:aViewController_.view];

aViewController_.view 保留视图,因此当您释放主控制器时,视图不会被释放,这是正确的。

在解除分配“主控制器”之前,您需要从超级视图中删除视图。

主控制器”在你释放时会消失,但超级视图仍然保留子视图。

当您完成视图后,您可以在 aViewController_ 的某个位置执行此操作,然后再释放拥有该视图的控制器。

不看你所有的代码很难说。

请记住,当您将视图添加到另一个视图时,超级视图会保留该视图,直到它被删除。

【讨论】:

另外,您不应该使用保留计数来确定对象是否被释放。对象并不总是立即释放。 我正在通过跟踪整个生命周期来检查“仪器”中的 retainCounts 我稍微澄清了这个例子。行 [self.view addSubview:aViewController_.view];正在添加 aViewController_.view 而您的答案描述的是相反的情况。 我要补充一点,在 Xcode 中使用“构建和分析”将有助于标记这类问题 @AJ:这是我发现它没有发布的地方

以上是关于UIView 未正确释放的主要内容,如果未能解决你的问题,请参考以下文章

移除对象时内存未释放 - 不清楚在 ARC 中释放的正确方法

启用事务支持时,spring-data-redis 连接是不是未正确释放?

释放视图对象

使用归档器复制 UIView - 内存释放?

如何让 UIView 忽略触摸而不释放它?

UIView 帧发送到释放的实例