我对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];}
谢谢,
萨姆
答案 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
中再次初始化