我是目标c的新手,我正在尝试了解如何/何时调用自动释放。我理解简单的用例:
- (void) foo {
Bar *b = [[[Bar alloc] init] autorelease];
[self doSomething:b];
}
下一个案例怎么样 - 这是一个错误,因为该对象将在离开makeBar的范围后立即被释放?
-(Bar*) makeBar
{
return [[[Bar alloc] init] autorelease];
}
如果来电者保留怎么办?
Bar *b = [[self makeBar] retain];
谢谢, -Eric
答案 0 :(得分:7)
在第二个示例中,一旦执行离开makeBar
的范围,但是在运行循环的下一次迭代中,将不会释放您返回的匿名对象。通过调用retain
makeBar
所以你的最后一个例子没问题,因为保留计数不会低于0。
你遇到麻烦了吗?
答案 1 :(得分:5)
-(Bar*) makeBar
{
return [[[Bar alloc] init] autorelease];
}
第二种情况是返回Objective-C对象的首选方式。除+alloc
,-copy...
和-create...
之外,该方法不应保留返回对象的所有权,即保留计数的(更改)应为0.
但是,[[Bar alloc] init]
使对象具有+1的retainCount,一个应该在返回之前释放它。但-release
将立即释放对象,使该方法无用。这就是使用-autorelease
的原因 - 它是延迟 -release
,即对象最终会被释放,但现在不会被释放,因此代码的其他部分仍然可以与之交互,但保留计数仍然可以平衡为0。
Bar *b = [[self makeBar] retain];
除非您希望成为对象b
的长期所有者,否则不保留 。