关于内存管理的iPhone问题

时间:2009-02-25 17:02:27

标签: iphone objective-c cocoa cocoa-touch

这是一个假设的吸气剂:

- (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吗?

1 个答案:

答案 0 :(得分:3)

不,你不会泄漏任何东西。

在返回控制器之前,没有向控制器添加额外的保留,并且在收到控制器时没有添加保留。如果您需要保证它的存在超出了您的功能范围,您应该在其上调用retain,并在完成时释放。

这通常是内存管理在Cocoa中的工作原理。当函数返回对象时,您没有所有权。除非你调用'retain',否则当它到达自然生命周期的末尾时它将被删除,这可能是下一帧,下一分钟左右。

例外是名称包含'alloc'或'copy'并返回新对象的函数。您有责任在不再需要时调用发布。