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 中释放的正确方法