Objective-C中的对象发布:为什么在viewDidUnload和dealloc方法中两次释放对象?

时间:2011-09-02 14:11:25

标签: objective-c release dealloc viewdidunload


我对objective-c中的对象释放有疑问。我在“开始iphone 4开发”(页287)的第9章中看到了一些示例代码。示例代码两次释放一个对象:viewDidUnload和dealloc方法。以下是示例代码:

- (void)viewDidUnload {
self.list = nil;
[childController release], childController = nil;}

- (void)dealloc {
[list release];
[childController release];
[super dealloc];}

childController 被声明为 UIViewController 子类的实例。为什么在 viewDidUnload dealloc 方法中都会发布它?由于 childController 已经在 viewDidUnload 中发布,是否有必要在 dealloc 方法中再次发布它?根据我的理解,我将编写如下代码:

- (void)viewDidUnload {
self.list = nil;
childController = nil;}
- (void)dealloc {
[list release];
[childController release];
[super dealloc];}

谢谢,
萨姆

3 个答案:

答案 0 :(得分:3)

问题是viewDidUnload不能保证每次调用dealloc方法。 (选中this question)。

viewDidUnload中释放对象的原因是为了避免内存泄漏。由于在内存不足警告时会调用viewDidUnload,因此您需要清理以避免在这种情况下出现问题。

并且在nil上调用release也不会造成任何问题,因此在dealloc方法中保留对象的释放是安全的,假设指针在其他地方被释放后设置为nil(如在您的示例中viewDidUnload。)

答案 1 :(得分:0)

为了优化可用内存,在UIViewControllers中实现延迟getter(实际上是惰性初始化器)并在 viewDidUnload 中释放易于重新分配的对象是一种很好的做法。 一个(简化的)懒惰的getter就像:

- (UIView *)footerView {
    if (_footerView) {
        return _footerView;
    }
    UIView *view = [[UIView alloc] initWithFrame:A_FRAME];
    return (_footerView = view);
}

所以,在 viewDidUnload 中,我将发布 _footerView ,因为我可以稍后检索它而不费力。在dealloc方法中发布 _footerView 不是错误,因为: 1)在目标c中可以向nil对象发送消息,2)dealloc不会与 viewDidUnload 同时执行,但稍后

答案 2 :(得分:0)

我调查了一下因为我不确定。您需要知道的只有:When should I release objects in -(void)viewDidUnload rather than in -dealloc?

基本上,在viewDidUnload中,您释放在视图生命周期开始时创建的对象(loadView,viewDid加载等)。因此,如果您的viewController接收到内存警告,它将卸载视图并重新加载它,然后您的对象将在viewDidUnload中释放并在loadView / viewDidLoad / ect

中再次初始化