我的代码中有一种情况,在没有先调用[super dealloc]
的情况下我无法清理我的类对象。它是这样的:
// Baseclass.m
@implmentation Baseclass
...
-(void) dealloc
{
[self _removeAllData];
[aVariableThatBelongsToMe release];
[anotherVariableThatBelongsToMe release];
[super dealloc];
}
...
@end
这很有效。我的问题是,当我去创建这个巨大而讨厌的类(超过2000行代码)的子类时,我遇到了一个问题:当我在调用[super dealloc]
之前释放我的对象时,我让僵尸运行代码我调用[self _removeAllData]
方法时激活。
// Subclass.m
@implementation Subclass
...
-(void) dealloc
{
[super dealloc];
[someObjectUsedInTheRemoveAllDataMethod release];
}
...
@end
这很好用,并没有要求我重构任何代码。我的问题是这样的:我这样做是否安全,或者我应该重构我的代码?或者也许自动释放对象?
如果重要的话,我正在为iPhone编程。
答案 0 :(得分:2)
好的,我在说垃圾。最后需要调用[super dealloc]
。
当然,这不能回答你的问题。
不看你的代码很难看,但问题似乎来自_removeAllData
方法
首先,您不应该为带有下划线的方法添加前缀,因为Apple(Reference)为私有方法保留了该前缀。
其次,它显然用于整理对象,可能会释放您稍后手动释放的对象。它甚至可以释放在其中一个超级类中定义的对象,这些超级类在[super dealloc]
中过度发布。
所以,经过一番思考(比实际应该采取的更多),问题不在于你的super的dealloc被调用的地方;但是在清理什么以及什么时候。
对于我之前的错误感到抱歉,感谢评论员说服我的错误,而不是让我坚持我的错误。
原始回答
是。只要你不尝试使用任何超类的变量。