【问题标题】:Who calls the dealloc method and when in Objective C?谁调用了dealloc方法,什么时候在Objective C中?
【发布时间】:2011-08-17 12:53:11
【问题描述】:

在 Objective C 中创建自定义类时,何时以及如何调用 dealloc 方法?这是我必须在课堂上以某种方式实现的东西吗?

【问题讨论】:

    标签: objective-c dealloc


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

      想象-release 在 NSObject 中是这样实现的:

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

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

      【讨论】:

      • 我希望这个方法体应该在'release'下,而不是'retain'下
      • @saran,你说得对。我的愚蠢错误;谢谢你抓住它。
      • 非常好的答案。我在上面给出了答案,但我认为你的答案在实际中是最好的..
      【解决方案3】:

      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 有关这些方法的使用的更多详细信息。

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 2012-11-30
          • 2010-11-04
          • 2012-06-02
          • 1970-01-01
          • 2011-11-07
          • 1970-01-01
          • 2012-05-14
          • 1970-01-01
          相关资源
          最近更新 更多