在[super dealloc]之后编写代码是否可以?

时间:2011-01-04 13:48:21

标签: objective-c memory-management

我的代码中有一种情况,在没有先调用[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编程。

1 个答案:

答案 0 :(得分:2)

好的,我在说垃圾。最后需要调用[super dealloc]

当然,这不能回答你的问题。

不看你的代码很难看,但问题似乎来自_removeAllData方法

首先,您不应该为带有下划线的方法添加前缀,因为Apple(Reference)为私有方法保留了该前缀。

其次,它显然用于整理对象,可能会释放您稍后手动释放的对象。它甚至可以释放在其中一个超级类中定义的对象,这些超级类在[super dealloc]中过度发布。

所以,经过一番思考(比实际应该采取的更多),问题不在于你的super的dealloc被调用的地方;但是在清理什么以及什么时候。

对于我之前的错误感到抱歉,感谢评论员说服我的错误,而不是让我坚持我的错误。

原始回答

  

是。只要你不尝试使用任何超类的变量。