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

Jas*_*ien 7 cocoa cocoa-touch memory-management objective-c foundation

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

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

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

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

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

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

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

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

Dar*_*ust 9

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

- (id) top {
    return [stack lastObject];
}
Run Code Online (Sandbox Code Playgroud)

想象一下:

foo = [bar top];
[bar removeAllObjects];
// Do something with foo
Run Code Online (Sandbox Code Playgroud)

将发生以下情况:第二行将使保留计数降至0,并且第三行将foo指向释放的内存.但随着retainautorelease保留计数为1,直到水池因此清空第三行foo会依旧指向有效的对象.

  • wm,同一文件说:"Cocoa的所有权政策规定收到的对象通常应该在调用方法的整个范围内保持有效.还应该可以从当前作用域返回接收到的对象而不用担心它被释放."如果一个动作使先前动作的返回值无效,则接口抽象将丢失.基础集合明确指定为策略例外. (6认同)
  • 做那个imho仍然不正确."内存管理编程指南"声明"正如您不应该关注对象的实际保留计数一样,您不应该关心返回给您的对象是否自动释放.唯一的问题是,您是拥有它还是不." - 所以retain + autorelease应该出现在foo = [bar top]中; 行,而不是 - (id)top {}方法. (4认同)