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

cpj*_*eur 7 memory-management objective-c

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

[controller release], controller = nil;
Run Code Online (Sandbox Code Playgroud)

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

这只是在Obj-C中做事的"老派"方式,还是比我意识到的更多?

jbr*_*nan 6

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

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

释放后将指针设置为nil意味着您无法将消息发送到受控对象.你完成了那个对象,你可以说出你想要的任何东西nil,没有伤害.