保留/自动释放已保留财产的额外好处是啥?

Posted

技术标签:

【中文标题】保留/自动释放已保留财产的额外好处是啥?【英文标题】:What's the added benefit of retain/autoreleasing an already retained property?保留/自动释放已保留财产的额外好处是什么? 【发布时间】:2011-04-15 16:04:31 【问题描述】:

在我目前正在进行的一个项目中,我正在研究我前辈的代码。我在这里遇到的一件事,有这样的吸气剂:

- (NSDictionary *)userInfo

    return [[userInfo retain] autorelease]; 

显然 userInfo 已经被类保留了,我没有得到的是:retain-autoreleasing 这个对象的附加值是什么?这种方法有什么不同:

- (NSDictionary *)userInfo

    return userInfo;

干杯, EP。

【问题讨论】:

也许他/她当时只是不了解内存管理?它可能有一个很好的理由,也许它“修复”了一个间歇性错误或相关问题。人们对他们编写的代码有各种各样的原因,有时当他们重新访问它时,它甚至对他们没有意义;) 【参考方案1】:

想象一下:

id x = [[A alloc] init];
NSDictionary *userInfo = [x userInfo];
[x release];
// Do something with userInfo ...
// Would fail if the getter did not retain/autorelease.

如果 getter 没有执行保留/自动释放操作,这将失败,因为 userInfo 将在 x 被释放时被释放。

【讨论】:

【参考方案2】:

它允许返回的结果在整个当前调用堆栈中保持不变,即使拥有的对象在此期间被释放。 Cocoa 中的习惯是任何由没有拥有引用的 getter 返回的东西(即,任何名称中没有“new”、“alloc”、“retain”或“create”的 getter)至少会持续封闭的自动释放池。

例如:

Object1 *object1 = [[Object1 alloc] init];
ResultObject *result = [object1 someResult];
[object1 release];

// result is still valid here, even though object1 was released

【讨论】:

+1 用于指出 object1 的释放,同时对 someResult 仍有保留计数。答案标记属于 Ole,因为它使用了与答案相同的术语。谢谢汤米! 哦,好吧;我希望首先回答,更笼统地回答为什么有人可能合法地期望结果仍然有效的原因会给我带来一些额外的信用,但提供帮助就足够了。

以上是关于保留/自动释放已保留财产的额外好处是啥?的主要内容,如果未能解决你的问题,请参考以下文章

NSDecimalNumberHandler 的保留/释放策略是啥

使用自动释放时,它实际上是啥时候释放的?

iPhone - 如果在自动释放后保留会发生啥?

从自动释放对象上的保留转向引用是不是需要释放?

@property(保留)是不是自动释放或释放对象?

自动释放和保留的使用