1

我正在完成一个 iPad 应用程序,对我来说,这意味着填写dealloc我的课程中的所有方法。

我的 nib 中有很多视图,其中大部分都包含子视图(即UIViews、UILabels 等)。我应该在释放父视图之前释放子视图吗?如果父视图被释放,它的子视图是否也会被释放?

样本:

-(void)dealloc
{
    [super dealloc];
    [childView release];  // Do I need this if I use the next line?
    [parentView release];  // Will this perform the line above?
}

两者childViewparentView都是我的视图控制器的属性。两者都被保留了。

4

3 回答 3

9

保留的任何内容(无论是显式保留还是通过保留属性)都需要释放,以平衡内存管理。

此外,您应该[super dealloc]在实现结束时调用dealloc,而不是在开始时调用(例如,因为您可能依赖于当时仍然可用的超类资源)。

于 2011-01-05T18:44:41.610 回答
2

顺便说一句,在您完成应用程序工作之前保存您的 dealloc-writing 是一种倒退的方式。我知道这看起来像是打扫房间的工作,但事实是,在您正确管理内存之前,您将对应用程序的实际执行情况有一个非常扭曲的看法。

理想情况下,您应该在编写 @synthesize 语句时编写您的 dealloc 调用。换句话说,您向您的类添加一个属性,将其设置为保留属性,编写其@synthesize 和-release 代码。这样你就知道你的内存管理基本上是干净的(我的意思是,无论如何在类属性级别),你可以放心地编码。

于 2011-01-05T19:08:53.833 回答
1

由于您指定您有来自NIB的子视图,因此听起来您可能还需要密切注意该viewDidUnload方法。

任何从 nib 自动分配的视图,您都可以通过将 outlet 设置为 nil 来隐式释放。例如:

- (void)viewDidUnload {
    [super viewDidUnload];
    self.subviewOutletOne = nil;
    self.subviewOutletTwo = nil;
}

然后对于您明确保留的任何对象,您可以像您计划的那样在 dealloc 方法中释放它们:

- (void)dealloc {
    [myDataArray release];
    [coolAnimatedImage release];
    [myCustomSubview release];
    [super dealloc];
}

还请务必检查LEAKS仪器。这是使用内置泄漏分析工具的随机教程。可能还有其他/更好的。第一次启动和运行可能会很痛苦,但完全值得。

于 2011-01-05T18:55:29.233 回答