保留后立即自动释放的重点是什么?

时间:2010-10-15 14:13:06

标签: objective-c cocoa cocoa-touch memory-management foundation

我正在查看一些开源代码并尝试理解作者为何以特定方式做了某些事情。

该类是NSArray的包装器,用于创建具有push,pop等的堆栈数据结构。

一个方法是topObject,它返回堆栈中最顶层的对象,其实现是:

- (id)top {
    return [[[stack lastObject] retain] autorelease]; // stack is an instance of NSMutableArray
}

什么是保留,然后是立即自动释放?

我最初的反应是,这会阻止分析仪警告内存泄漏,但是我在没有保留/自动释放的情况下进行了分析,但仍然没有警告。

查看生命周期,将创建一个对象,将其推送到堆栈并释放,因此堆栈拥有该对象(底层数组将在添加时保留它)。

所以我不明白这里使用retain / autorelease ......

1 个答案:

答案 0 :(得分:9)

我们假设top看起来像这样:

- (id) top {
    return [stack lastObject];
}

然后想象一下:

foo = [bar top];
[bar removeAllObjects];
// Do something with foo

将发生以下情况:第二行将使保留计数降至0,并且第三行foo将指向释放的内存。但是使用retainautorelease,保留计数为1,直到池清空为止,因此第三行foo仍将指向有效对象。