谁在调用dealloc方法以及何时在Objective C中?

问题描述:

在目标C中创建自定义类时,何时以及如何调用dealloc方法?这是我必须在班上以某种方式实施的吗?谁在调用dealloc方法以及何时在Objective C中?

你从来没有直接发送dealloc的消息。取而代之的是,对象的dealloc方法是通过释放NSObject的协议方法调用间接(如果该释放消息中接收器的保留计数成为0的结果)。见内存管理编程指南在使用这些方法的详细信息。

子类必须实现自己的dealloc的版本允许通过重新分配的对象所拥有的用于数据动态分配存储或对象,例如对象的实例变量消耗任何额外的内存释放。执行类特定的释放后,子类方法应该通过一个消息包含的dealloc的超版本的超:

重要提示:请注意,当一个应用程序终止,对象可能不会因为进程的内存发送的dealloc 消息在退出时自动清除 - 这是更高效的 只是为了允许操作系统清理资源,而不是调用所有内存管理方法。对于这样那样的原因,你不应该在 的dealloc

- (void)release 
{ 
    _retainCount--; 
    if (_retainCount == 0) { 
     [self dealloc]; 
    } 
    } 

运行时会为你做的,当对象不再需要(其运行时决定为好)。只要确保您保留并正确释放。不要在其他对象上调用dealloc。

dealloc管理稀缺资源被称为的memory management结果。一旦对象“retainCount”达到0,则dealloc消息会自动发送到该对象。

你应该调用的dealloc在对象上,除非它是在重写的dealloc年底[super dealloc];通话。

-(void)dealloc 
{ 
    [ivar release]; //Release any retained variables before super dealloc 

    [super dealloc]; //Only place in your code you should ever call dealloc 
} 

而且根据-[NSObject dealloc] discussion

你从来没有直接发送dealloc的消息。取而代之的是,对象的 dealloc方法是通过释放NSObject的 协议方法调用的间接(如果在接收机的 所述释放消息的结果保留计数成为0)。有关使用这些方法的更多详情,请参阅Memory Management Programming Guide的 。

试想一下,-release在NSObject的实现是这样的:

- (void)release 
{ 
    _retainCount--; 
    if (_retainCount == 0) { 
     [self dealloc] 
    } 
} 

我敢肯定它比这更复杂一些,但回答你的问题是,对象本身将调用-dealloc时其保留计数降至零。但是,您的自定义类将从NSObject继承此行为。你永远不需要在你编写的代码中调用-dealloc;当对象被正确释放时,它总会自动发生。

+0

我希望这个方法体应该是在“释放”,而不是“保留” – Saran 2011-08-17 13:23:43