余额保留与释放?

问题描述:

我只是好奇,是否需要在其他地方添加一个[名称释放]来匹配getter中的保留位置?余额保留与释放?

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

加里

我不知道你的变量定义是如何在你的类中,但是规则是在你的getter中你应该返回引用计数不变的对象。如果要保留对它的引用,那么调用者的责任是致电保留。

- (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; 

有了这样的,当你赋予变量挽留将被调用。

+0

不要忘记相应的“@synthesize名称;” – nall 2009-09-30 16:13:47

没有,这是好的。 autorelease会导致当前的自动释放池被耗尽时释放该值。

每个保留都必须与正确的释放或自动释放中的一个匹配。

但是,我相信保留和autorelease都不需要在这里。通常你想使用autorelease惯用法,因为你已经在方法中分配了一些东西。

+0

这就是我正在计算,保留只是让NSString挂起。 – fuzzygoat 2009-09-30 16:09:54

+1

但是,这并不是这个方法的责任,它代表调用者。如果需要,此方法的调用者应该保留它。 – nall 2009-09-30 16:11:30

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

再多一点解释,这里发生的情况是,当您执行retain时,您的保留数量会增加1,如果由于autorelease而导致范围存在,则会减少1。

+0

代码很简单,由Xcode为实例变量生成:NSString * name; – fuzzygoat 2009-09-30 16:22:14

编号autorelease会将其平衡。然而,我不认为retainautorelease是必要的。你可以简单地使用return name

+0

这个想法是,如果有东西获得属性,然后设置它,它得到的对象不会死在它上面。 (我会使用'copy'而不是'retain',尤其是如果支持属性的对象是可变的。) – 2009-09-30 23:56:43

我想我可能已经想通了:

如果该方法之外创建[myString的]那么你可以放心使用......

return myString; 

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

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

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

+1

第一个示例中的[]括号是不必要的。返回'myObj'不会*自动释放对象 - 它根本不会修改保留计数,这就是重点。如果你在一个方法内创建一个对象,你不应该在自动释放它之前保留它。一般来说,对象要么有一个+1保留计数(通过alloc/init,copy等创建),你需要自动释放,或者+0保留计数,你不需要做任何事情。当你返回一个实例变量时,封闭对象通常被认为拥有该对象,所以你只需返回它而不保留/自动释放它。 – 2009-09-30 16:48:35

+0

根据你的意见,苹果为什么通过“Place Accessor Def On Clipboard”从Xcode生成这个返回序列? – fuzzygoat 2009-09-30 17:07:03

+0

可能在需要时处理案件。我不会详细查看它,但在这种情况下,您可以安全地将其删除。 – 2009-09-30 17:12:45

正如其他人所说,你不需要保留或autorelease财产。由于'getter'方法的调用者没有创建该对象,所以他们不拥有它,并且可以安全地假定他们不会修改它的保留计数。

但是,调用者可能会改变getter返回的变量的值,这会影响对象。因此,返回变量的副本可能会更好,特别是因为它是NSString。 (对NSString的吸气剂对象往往返回副本。)

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

在这种情况下,您所创建的变量的副本,让你“拥有”它。通过在返回之前自动释放它,确保它在活动者的作用域中能够存活足够长的时间,并且他们对'name'变量所做的任何更改都不会影响底层对象。

+0

的确,这是一个很好的观点。 – fuzzygoat 2009-09-30 18:03:42

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

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

没有,因为你已经将其释放。 autorelease只是意味着“稍后自己发送release”。

我想你应该检讨the memory-management rules

+0

再次阅读它们,现在:)所以我可以认为在这种情况下,保留与autorelease配对? – fuzzygoat 2009-10-01 08:36:10

+0

保留由autorelease引起的释放进行平衡。所以是的,一个'autorelease'消息平衡一个'retain'或'copy'消息,就像立即释放'消息一样。 – 2009-10-01 08:50:28