Objective-C在函数中返回alloc'd内存==坏?

Dev*_*Dev 3 iphone memory-management objective-c

这是在iPhone上.

那么如果我有类似的功能呢?

- (SomeObject*)buildObject;
Run Code Online (Sandbox Code Playgroud)

我是否需要传入一个我已经在外部分配的变量

- (void)assignObject(SomeObject** out);
Run Code Online (Sandbox Code Playgroud)

或者我可以做

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

并使用它

SomeObject* obj = [[otherObject buildObject] retain];
Run Code Online (Sandbox Code Playgroud)

我想做最后一个,但据我所知,这是未定义的,因为autorelease只保证对象直到函数结束?

Bry*_*yle 6

在Objective-C中,内存管理契约如下:调用alloc的人负责调用release.如果构造函数调用[[[class alloc] init] release],则会快速创建并销毁该对象.

为了解决这个问题,构造函数需要使用自动释放,如下所示:

return [[[Class alloc] init] autorelease];
Run Code Online (Sandbox Code Playgroud)

它注册要在当前运行循环结束时释放的对象,除非保留它,例如构造函数的调用者.在您的情况下,第二个示例正是您想要做的.

所以:

- (SomeClass*) buildObject {
   return [[[SomeClass alloc] init] autorelease];
}

- (void) doSomething {
   c = [self buildObject];
   // Call [c retain] if you want c to stay around after the current run
   // loop is finished and clean it up later, e.g. in your delloc method.
}
Run Code Online (Sandbox Code Playgroud)