Objective c 什么';保留/自动收回已保留财产的额外好处是什么?

Objective c 什么';保留/自动收回已保留财产的额外好处是什么?,objective-c,memory-management,retain,autorelease,Objective C,Memory Management,Retain,Autorelease,在我目前正在进行的一个项目中,我正在通过我前任的代码进行工作。我在这里遇到的其中一件事是这样的: - (NSDictionary *)userInfo { return [[userInfo retain] autorelease]; } 显然,类已经保留了userInfo,但我没有得到的是:retain自动删除这个对象的附加值是什么?这种方法的区别是什么: - (NSDictionary *)userInfo { return userInfo; } 干杯, EP.它允许

在我目前正在进行的一个项目中,我正在通过我前任的代码进行工作。我在这里遇到的其中一件事是这样的:

- (NSDictionary *)userInfo
{
    return [[userInfo retain] autorelease]; 
}
显然,类已经保留了userInfo,但我没有得到的是:retain自动删除这个对象的附加值是什么?这种方法的区别是什么:

- (NSDictionary *)userInfo
{
    return userInfo;
}
干杯,

EP.

它允许返回的结果在当前调用堆栈的整个过程中保持不变,即使拥有的对象在此期间被解除分配。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
想象一下:

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没有执行retain/autorelease操作,这将失败,因为
userInfo
将在
x
被释放时被释放。

可能他/她当时不懂内存管理?这可能有一个很好的理由,也许它“修复”了一个间歇性错误或相关问题。人们编写代码有各种各样的原因,有些时候,当他们再次访问代码时,代码对他们来说甚至毫无意义;)+1用于指出object1的发布,同时在someResult上仍有保留计数。不过,答案标记是Ole,因为它使用了与答案相同的术语。谢谢你,汤米!哦,好吧;我希望先回答,更笼统一点,并评论一下为什么有人会合理地认为结果仍然有效,这会给我带来一些额外的荣誉,但有了帮助就足够了。