7

我是目标 c 的新手,并试图了解如何/何时调用 autorelease。我了解以下简单用例:

- (void) foo {
    Bar *b = [[[Bar alloc] init] autorelease];
    [self doSomething:b];
  }

那么下一个案例呢——这是一个错误,因为该对象将在离开 makeBar 的范围后立即释放?

-(Bar*) makeBar
{
    return [[[Bar alloc] init] autorelease];
}

如果调用者进行了保留怎么办?

Bar *b = [[self makeBar] retain];

谢谢,-埃里克

4

2 回答 2

8

在您的第二个示例中,您返回的匿名对象将不会在执行离开范围后立即释放,makeBar而是在运行循环的下一次迭代中。这将使您有机会以retain任何方法调用它makeBar

所以你的最后一个例子是好的,因为保留计数不会低于 0。

你有麻烦吗?

于 2010-02-17T16:12:17.970 回答
6
-(Bar*) makeBar
{
    return [[[Bar alloc] init] autorelease];
}

第二种情况是返回 Objective-C 对象的首选方式。除了和+alloc,该方法不应保留返回对象的所有权,即(更改的)保留计数应为 0。-copy...-create...

但是,[[Bar alloc] init]使对象具有+1的retainCount,一个人应该在返回之前释放它。但是-release会立即释放对象,使该方法无用。这就是-autorelease使用的原因——它是一个延迟 -release的,即对象最终会被释放,但不是现在,所以代码的其他部分仍然可以与之交互,但保留计数仍然可以平衡为 0。


Bar *b = [[self makeBar] retain];

除非您想成为该对象的长期所有者,否则不应保留它。b

于 2010-02-17T16:16:24.183 回答