为什么在Obj-C中发送释放消息后将对象设置为nil

时间:2010-06-18 17:54:33

标签: objective-c memory-management

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

[controller release], controller = nil;

为什么在发送发布消息后将变量设置为nil?不管是什么,释放是不是要释放对象?为什么它也需要设置为nil。

这只是一种在Obj-C中做事的“老派”方式,还是比我意识到的还要多呢?

4 个答案:

答案 0 :(得分:6)

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

所以,你可能会释​​放你的对象,但你仍然可以指向它。然后它可以自动释放。然后你发送一条消息 - 但现在对象可能是垃圾。那很糟糕。

释放后将指针设置为nil意味着您无法向被控对象发送消息。你已经完成了这个对象,你可以对nil说出你想要的任何内容,不会造成任何伤害。

答案 1 :(得分:2)

两件事

  • 正如jbrennan所指出的那样,使对象指针无效将阻止程序因使用以前的dealloc对象而崩溃。
    我认为这是一件坏事,因为你可能会以这种方式混淆代码中的错误或概念上的弱点。
    如果 - 另一方面 - 您刚刚发布的对象超出范围或者绝对不会再次使用 - 无论如何,编译器将剥离此赋值。
  • 在垃圾收集环境中,将release发送到对象doesn't have any effect 根据你正在做的 ,你可以将对象指针设置为nil 来区分GC是否会收获对象与否。
    因此,如果没有赋值,对象可以生存,并且不仅会阻止资源,但由于它完全存活且有效,可能会产生虚假的副作用。

答案 2 :(得分:0)

由于将消息发送到nil对象是Objective-C中的有效操作(没有任何反应),因此如果在释放对象后发送消息,则将对象指针设置为nil可防止发生错误。

答案 3 :(得分:0)

除了其他回复之外,将发布的对象设置为nil是很常见的,特别是当对象不是完全本地的(可能是另一个对象的成员)时。这使您可以轻松检查并查看之前是否已释放对象,以便在需要时再次创建它。