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




我有一个关于objective-c中对象释放的问题。我在"开始iphone4开发"(第287页(的第9章中看到了一些示例代码。示例代码释放一个对象两次:都是在viewDidUnload和dealloc方法中。以下是示例代码:

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

childController被声明为UIViewControllersubclass的实例。为什么它同时以viewDidUnloaddealloc方法发布?由于childController已经在viewDidUnload中释放,是否需要在dealloc方法中再次释放它?根据我的理解,我将编写如下代码:

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

谢谢,
Sam

问题是viewDidUnload不能像dealloc方法那样保证每次都被调用。(勾选此问题(。

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

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

为了优化可用内存,在UIViewControllers中实现惰性getter(实际上是惰性初始化器(并在viewDidUnload中发布易于实现的对象是一种很好的做法。一个(简化的(惰性getter类似于:

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

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

我进行了一些调查,因为我不确定。您需要知道的是:我什么时候应该在-(void(viewDidUnload中释放对象,而不是在-dealloc中?

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

最新更新