我只是很好奇,我是否需要在其他地方添加[name release]以匹配getter中的retain?
- (NSString *)name {
return [[name retain] autorelease];
}
加里
答案 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
将平衡它。但是,我不认为retain
和autorelease
是必要的。您只需使用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并返回。当池被销毁时,该对象最终将被释放。