这是在 iPhone 上。
那么如果我有一个像这样的函数呢
- (SomeObject*)buildObject;
我是否需要传递一个已经在外部分配的变量,例如
- (void)assignObject(SomeObject** out);
或者我可以做
- (SomeObject*)buildObject
{
return [[[SomeObject alloc] init] autorelease];
}
并像这样使用它
SomeObject* obj = [[otherObject buildObject] retain];
我想做最后一个,但据我所知,这是未定义的,因为 autorelease 仅保证对象直到函数结束?
在 Objective-C 中,内存管理契约如下:谁调用了 alloc,谁就负责调用release。如果构造函数调用[[[Class alloc] init]release],则对象会快速创建和销毁。
为了解决这个问题,构造函数需要使用 autorelease,如下所示:
return [[[Class alloc] init] autorelease];
它注册要在当前运行循环结束时释放的对象,除非有东西保留它,例如构造函数的调用者。就您而言,第二个示例正是您想要做的。
So:
- (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.
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)