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
在第二个示例中,一旦执行离开makeBar运行循环的下一次迭代的范围,您将返回的匿名对象将不会被释放.这将使您有机会以retain任何方式调用它makeBar
所以你的最后一个例子是好的,因为保留计数不会低于0.
你有麻烦吗?
-(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.
| 归档时间: |
|
| 查看次数: |
3166 次 |
| 最近记录: |