代码之家  ›  专栏  ›  技术社区  ›  cpjolicoeur

为什么在obj-c中发送释放消息后将object设置为nil?

  •  7
  • cpjolicoeur  · 技术社区  · 15 年前

    我看到很多Objective-C代码在试图从内存中释放不再需要的对象时具有以下语法。

    [controller release], controller = nil;
    

    为什么在发送发布消息后将变量设置为nil?释放不会释放物体吗?为什么还需要设置为零。

    这仅仅是一种在OBJ-C中做事情的“老派”方式,还是有比我意识到的更多的方式?

    4 回复  |  直到 15 年前
        1
  •  6
  •   jbrennan    15 年前

    打电话 release 在一个对象上并不一定意味着它将被释放。它只是减少对象的保留计数。直到保留计数达到0,对象才会被释放(即使这样,对象也可能在自动释放池中,但在那时仍然不会被释放)。

    所以,您可以释放对象,但仍然可以指向它。然后它可以自动释放。然后你给它发送一条信息,但也许这个物体现在是垃圾。那太糟糕了。

    释放指针后将其设置为nil,这意味着您无法将消息发送到垃圾对象。你已经完成了,你想说什么就说什么 nil 没有坏处。

        2
  •  2
  •   danyowdee    15 年前

    两件事

    • 如jbrennan所述,使对象指针无效 阻止程序在使用以前的 dealloc 对象。
      不过,我认为这是一件坏事,因为这样可能会混淆代码中的错误或概念缺陷。
      另一方面,如果刚刚发布的对象超出范围,或者肯定不会再次使用,那么编译器将在优化过程中删除此分配。
    • 在垃圾收集环境中,发送 release 对对象 doesn't have any effect .
      取决于 什么 你在做和 哪里 这样做,将对象指针设置为nil 可以 区别GC是否将获取对象。
      因此,如果不分配对象 可以 活下去不仅会阻塞资源,而且因为它是完全活的和有效的, 可以 产生虚假的副作用。
        3
  •  0
  •   Ferruccio    15 年前

    由于向nil对象发送消息是Objective-C中的有效操作(未发生任何情况),因此将对象指针设置为nil可防止在对象释放后发送消息时发生错误。

        4
  •  0
  •   Donnie    15 年前

    除了其他答复之外,在许多语言中,将已发布对象设置为 nil 尤其是当对象不是完全本地的时候(可能是另一个对象的成员)。这使您可以轻松地检查和查看对象是否已被释放,以便在需要时再次创建它。