这是一个假设的吸气剂:
- (DetailViewController *)detailController
{
if (detailController == nil) {
DetailViewController *controller = [[DetailViewController alloc] initWithNibName:@"Detail" bundle:nil];
self.detailController = controller;
[controller release];
}
return detailController;
}
然后调用它的代码看起来像是:
- (void)loadControllerOrSomething
{
DetailViewcontroller *controller = self.detailController;
[navigationController doSomethingWith:controller];
}
关于内存管理的问题如下。如果我让*控制器超出范围,在loadControllerOrSomething中,我是否泄漏内存?使用navigationController后我应该做一个controller = nil吗?
答案 0 :(得分:3)
不,你不会泄漏任何东西。
在返回控制器之前,没有向控制器添加额外的保留,并且在收到控制器时没有添加保留。如果您需要保证它的存在超出了您的功能范围,您应该在其上调用retain,并在完成时释放。
这通常是内存管理在Cocoa中的工作原理。当函数返回对象时,您没有所有权。除非你调用'retain',否则当它到达自然生命周期的末尾时它将被删除,这可能是下一帧,下一分钟左右。
例外是名称包含'alloc'或'copy'并返回新对象的函数。您有责任在不再需要时调用发布。