【发布时间】:2009-06-23 05:36:10
【问题描述】:
我的基类具有子类使用的属性。应该在哪里调用 Release?在原来的基类还是继承它的类?
【问题讨论】:
标签: objective-c memory-management
我的基类具有子类使用的属性。应该在哪里调用 Release?在原来的基类还是继承它的类?
【问题讨论】:
标签: objective-c memory-management
我会说每个类都管理它自己的属性。所以子类应该释放它的属性,而基类应该释放它自己的。
一旦子类被释放,它将无法访问基类属性,从技术上讲,它不再存在。标准的dealloc写法是:
- (void)dealloc
{
// release my stuff, after this line
// I don't exist and do not need to access any of my properties
[super dealloc];
}
【讨论】:
如果属性只被子类使用,它们应该在子类(而不是父类)中定义,并且子类应该在它的 -(void)dealloc 函数中释放它们。你会有这样的东西:
- (void)dealloc
{
[username release];
[password release];
[super dealloc];
}
请注意,我们不会在属性上调用 dealloc!我们只是称之为“释放”,这意味着我们将不再使用它们并且系统可以清理它们(前提是没有其他人在使用它们)。
【讨论】:
我对 Objective-C 很陌生,所以我也很好奇这里的最佳答案是什么。我认为您应该在父类-dealloc 中将属性设置为nil,该属性是在其中合成的。如果你出于某种原因将它保留在子类中,你也应该在子类中释放它,但在超类中将属性设置为 nil 不应该有任何负面影响。
【讨论】:
在给定的块中,retain、copy、alloc 的调用次数应与 release、autorelease 的调用相平衡。 如果你在子类中保留一些东西,在子类中释放它,如果在基类中......
我是从一篇关于逐步的文章中凭记忆解释的。
【讨论】:
简答:在基类中。
长答案:对象由其他对象“拥有”。要拥有一个对象,您必须分配或保留它(使用保留、分配、新建或复制)。所有者负责通过释放或自动释放来处理内存。每个分配/保留都应该有一个释放/自动释放。
Cocoa 约定只有以“new”和“copy”开头的方法返回已分配/复制/保留但不属于方法接收者的对象。所有者就是调用“新建”或“复制”函数的对象。
【讨论】: