谁调用dealloc方法和什么时候在Objective C?

时间:2011-08-17 12:53:11

标签: objective-c dealloc

在Objective C中创建自定义类时,调用dealloc方法的时间和方式是什么?这是我必须在课堂上以某种方式实现的吗?

4 个答案:

答案 0 :(得分:17)

您永远不会直接发送dealloc消息。相反,通过释放NSObject协议方法间接调用对象的dealloc方法(如果释放消息导致接收者的保留计数变为0)。有关使用这些方法的详细信息,请参阅“内存管理编程指南”。

子类必须实现自己的dealloc版本,以允许释放对象消耗的任何额外内存 - 例如动态分配的存储空间,用于释放对象所拥有的数据或对象实例变量。在执行特定于类的释放后,子类方法应该通过消息将dealloc的超类版本合并到super:

重要说明:请注意,当应用程序终止时,可能不会向对象发送dealloc  消息,因为进程的内存在退出时自动清除 - 它更有效 只是允许操作系统清理资源而不是调用所有内存 管理方法。由于这个原因和其他原因,你不应该管理稀缺的资源 的dealloc

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

答案 1 :(得分:5)

想象一下-release在NSObject中实现如下:

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

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

答案 2 :(得分:2)

memory management导致

dealloc被调用。一旦对象“retainCount”达到0,则会自动将dealloc消息发送到该对象。

除非在重写的dealloc结束时调用[super dealloc];,否则不应该在对象上调用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消息。相反,一个对象   通过发布NSObject间接调用dealloc方法   协议方法(如果释放消息导致接收者的   保留计数变为0)。请参阅Memory Management Programming Guide   关于使用这些方法的更多细节。

答案 3 :(得分:1)

当不再需要该对象时(运行时也决定该对象),运行时将为您执行此操作。只需确保正确保留和释放。不要在其他对象上调用dealloc。