平衡保留与释放?

时间:2009-09-30 15:53:31

标签: objective-c cocoa

我只是很好奇,我是否需要在其他地方添加[name release]以匹配getter中的retain?

- (NSString *)name {
    return [[name retain] autorelease];
}

加里

7 个答案:

答案 0 :(得分:3)

不,但你根本不需要这样做,因为你没有分配任何东西。你可以简单地返回名字,这应该没问题。您是否有理由需要添加此保留/自动释放?

稍作解释一下,这里发生的事情是,当您执行retain时,保留计数会增加1,而当范围因autorelease而存在时,保留计数会减1。 / p>

答案 1 :(得分:2)

不,这很好。 autorelease将导致在当前自动释放池耗尽时释放该值。

每个保留必须与释放或自动释放中的1个匹配。

但是,我认为这里不需要保留和自动释放。通常你想使用那个autorelease习语,因为你已经在方法中分配了一些东西。

答案 2 :(得分:2)

我不知道您的类中的变量定义如何,但规则是在getter中您应该为引用计数返回未更改的对象。如果要保留对它的引用,则调用者可以负责调用retain。

- (NSString*) name {
  return name;
}

// caller
NSString* name = object.name;
[name retain]; // if necessary. If the string is used only in the context of a method you do not have to retain it.

如果您将返回的值用作另一个类中的字段,则应该像这样定义字段:

@property(retain, nonatomic) NSString* name;

使用此选项时,将在分配给变量时调用retain。

答案 3 :(得分:1)

没有。 autorelease将平衡它。但是,我不认为retainautorelease是必要的。您只需使用return name

即可

答案 4 :(得分:1)

正如其他人所说,您无需保留或自动退款。由于'getter'方法的调用者没有创建对象,他们不拥有它,你可以安全地假设他们不会修改它的保留计数。

但是,调用者可能会更改getter返回的变量的值,这会影响对象。因此,返回变量的副本可能是一个更好的主意,特别是因为它是一个NSString。 (NSString对象的getters通常会返回一个副本。)

- (NSString *)name {
    return [[name copy] autorelease];
}

在这种情况下,您正在创建变量的副本,因此您“拥有”它。通过在返回之前自动释放它,可以确保它能够存活足够长的时间以便在调用者的范围内使用,并且它们对“name”变量所做的任何更改都不会影响底层对象。

答案 5 :(得分:1)

  

我只是很好奇,我是否需要在其他地方添加[name release]以匹配getter中的retain?

- (NSString *)name {
    return [[name retain] autorelease];
}

不,因为你已经发布了它。 autorelease只是意味着“稍后发送给自己release。”

我认为您应该查看the memory-management rules

答案 6 :(得分:0)

我想我可能已经弄明白了:

如果在方法之外创建了[myString],那么您可以安全地使用...

return myString;

如果另一方面[myString]是在方法内部创建的,因此需要释放并返回,然后使用。

myString = [[NSString alloc] initWithFormat: @"Send me home"]; 
return [myString autorelease];

这种方法将[myString]设置为autorelease,基本上创建对象,设置为autorelease并返回。当池被销毁时,该对象最终将被释放。