2011-04-15 68 views
2

在我正在研究的项目中,我正在通过我的前任的代码进行工作。的事情之一,我在这里遇到并有干将这样的:保留/ autoreleasing一个已保留的财产的附加好处是什么?

- (NSDictionary *)userInfo 
{ 
    return [[userInfo retain] autorelease]; 
} 

显然USERINFO已经由类保留,什么我不明白的是:什么是保留的,自动释放该对象的附加价值?什么是使用这种方法的区别是:

- (NSDictionary *)userInfo 
{ 
    return userInfo; 
} 

干杯,
EP。

+0

也许他/她当时不理解内存管理?这可能是一个很好的理由,也许它会“修复”一个间歇性的错误或相关问题。人们对他们编写的代码有各种各样的原因,有些时候甚至在他们重新访问时对他们没有任何意义;) – tomasmcguinness 2011-04-15 16:07:32

回答

3

想象一下:

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

如果吸气没做保留/自动释放的事情,因为当x被释放userInfo会得到释放这将失败。

3

它允许返回的结果持续存在整个当前调用堆栈,即使拥有的对象在过渡期间被释放。 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 
+0

+1用于指出object1的发布,同时还有一个保留计数someResult。答案标记去Ole,因为使用与答案相同的术语。谢谢汤米! – epologee 2011-04-15 20:25:37