为什么自我实现的getter会保留并自动释放返回的对象?

Tha*_*nks 11 iphone cocoa-touch memory-management uikit

例:

- (NSString*) title {
    return [[title retain] autorelease];
}
Run Code Online (Sandbox Code Playgroud)

二传手实际上已经保留了它,对吧?实际上没有人应该绕过Setter ......所以我想知道为什么吸气剂不仅仅会返回物体?它实际上已经保留了下来.或者只是在同时将另一个对象传递给setter的情况下才需要它?

oxi*_*gen 12

从这里http://www.macosxguru.net/article.php?story=20030713184140267

- (id)getMyInstance
    {
        return myInstanceVar ;
    }
Run Code Online (Sandbox Code Playgroud)

要么

- (id)getMyInstance
{
    return [[myInstanceVar retain] autorelease] ;
}
Run Code Online (Sandbox Code Playgroud)

有什么不同 ?第二个允许调用者获取容器对象的实例变量,处理容器并继续使用实例变量,直到当前自动释放池的下一个版本,而不会受到间接生成的实例变量的释放的影响通过释放其容器:

aLocalVar = [aContainer getAnInstanceVar] ;
[aContainer release];
doSomething(aLocalVar);
Run Code Online (Sandbox Code Playgroud)

如果"get"以第一种形式实现,您应该写:

aLocalVar = [[aContainer getAnInstanceVar] retain];
[aContainer release];
doSomething(aLocalVar);
[aLovalVar release];
Run Code Online (Sandbox Code Playgroud)

第一种形式在代码执行速度方面更有效.但是,如果你正在编写供其他人使用的框架,也许应该推荐第二个版本:它使使用你的框架的人们的生活变得更容易:他们不必过多考虑他们在做什么......;如果您选择第一个样式版本,请在文档中清楚地说明......无论您选择哪种方式,请记住从版本1更改为版本2是为客户端代码保存,从版本2返回到版本1将破坏现有版本客户代码......


smo*_*gan 7

这不仅适用于有人释放容器的情况,因为在这种情况下,更明显的是他们应该自己保留对象.考虑以下代码:

NSString* newValue = @"new";
NSString* oldValue = [foo someStringValue];
[foo setSomeStringValue:newValue];
// Go on to do something with oldValue
Run Code Online (Sandbox Code Playgroud)

这看起来很合理,但如果setter和getter都没有使用自动释放,那么"继续做某事"部分可能会崩溃,因为oldValue现在已被释放(假设没有其他人保留它).您通常希望使用Apple的访问器方法示例中的技术1或技术2,因此上述代码将像大多数人所期望的那样工作.