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只保证对象直到函数结束?
在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)
| 归档时间: |
|
| 查看次数: |
813 次 |
| 最近记录: |