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

esi*_*ver 7 memory-management objective-c autorelease

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

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

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

-(Bar*) makeBar
{
    return [[[Bar alloc] init] autorelease];
}
Run Code Online (Sandbox Code Playgroud)

如果来电者保留怎么办?

Bar *b = [[self makeBar] retain];
Run Code Online (Sandbox Code Playgroud)

谢谢,-Eric

Tom*_*ing 7

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

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

你有麻烦吗?


ken*_*ytm 5

-(Bar*) makeBar
{
    return [[[Bar alloc] init] autorelease];
}
Run Code Online (Sandbox Code Playgroud)

第二种情况是返回Objective-C对象的首选方法.除+alloc,-copy...并且-create...,该方法应保留没有返回对象的所有权,即,在(的变化)保留计数应为0.

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


Bar *b = [[self makeBar] retain];
Run Code Online (Sandbox Code Playgroud)

你应该保留它,除非你想成为对象的长期所有者b.