1


我对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子类的实例。为什么在viewDidUnloaddealloc方法中都释放它?既然childController已经在viewDidUnload中释放了,是否需要在dealloc方法中再次释放呢?根据我的理解,我将编写如下代码:

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

谢谢,
山姆

4

3 回答 3

3

问题是viewDidUnload不能保证每次都像dealloc方法一样被调用。(检查这个问题)。

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

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

于 2011-09-02T14:24:32.007 回答
0

为了优化可用内存,在 UIViewControllers 中实现惰性 getter(实际上是惰性初始化器)并在viewDidUnload中轻松释放可重新分配的对象是一个很好的做法。一个(简化的)惰性吸气剂是这样的:

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

所以,在viewDidUnload我将释放_footerView,因为我可以稍后轻松地检索它。在dealloc方法中释放_footerView,不是错误,因为:1)在objective c中可以向nil对象发送消息,2)dealloc不会和viewDidUnload同时执行,而是稍后执行

于 2011-09-02T14:39:10.000 回答
0

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

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

于 2011-09-02T15:01:51.563 回答