返回自动释放目标c中的错误吗?

时间:2010-02-17 16:06:16

标签: objective-c memory-management autorelease

我是目标c的新手,我正在尝试了解如何/何时调用自动释放。我理解简单的用例:

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

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

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

如果来电者保留怎么办?

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

谢谢, -Eric

2 个答案:

答案 0 :(得分:7)

在第二个示例中,一旦执行离开makeBar的范围,但是在运行循环的下一次迭代中,将不会释放您返回的匿名对象。通过调用retain

的方法,这将使您有机会makeBar

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

你遇到麻烦了吗?

答案 1 :(得分:5)

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

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

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


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

除非您希望成为对象b的长期所有者,否则保留