【问题标题】:iPhone question regarding memory management关于内存管理的 iPhone 问题
【发布时间】:2009-02-25 17:02:27
【问题描述】:

这是一个假设的吸气剂:

- (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];
}

我关于内存管理的问题如下。如果我让 *controller 超出范围,在 loadControllerOrSomething 中,我会泄漏内存吗?使用navigationController 后我应该做一个controller = nil 吗?

【问题讨论】:

    标签: iphone objective-c cocoa cocoa-touch


    【解决方案1】:

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

    在返回之前没有向控制器添加额外的保留,接收时也没有添加保留。如果你需要保证它存在于你的函数范围之外,你应该在它上面调用retain,并在完成后释放。

    这通常是 Cocoa 中内存管理的工作方式。当函数返回对象时,您没有所有权。除非您调用“保留”,否则它将在其自然生命周期结束时被删除,可能是下一帧、下一分钟等。

    例外情况是名称包含“alloc”或“copy”并返回新对象的函数。您有责任在不再需要它们时调用 release。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-07
      • 2011-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-06
      • 1970-01-01
      相关资源
      最近更新 更多