我看到很多Objective-C代码在尝试从不再需要的内存中释放对象时具有以下语法。
[controller release], controller = nil;
为什么在发送发布消息后将变量设置为nil?不管是什么,释放是不是要释放对象?为什么它也需要设置为nil。
这只是一种在Obj-C中做事的“老派”方式,还是比我意识到的还要多呢?
答案 0 :(得分:6)
在对象上调用release
并不一定意味着它将被释放。它只是递减对象的保留计数。直到保留计数达到0才会释放对象(即使这样,对象也可能在自动释放池中,但仍然没有被释放)。
所以,你可能会释放你的对象,但你仍然可以指向它。然后它可以自动释放。然后你发送一条消息 - 但现在对象可能是垃圾。那很糟糕。
释放后将指针设置为nil意味着您无法向被控对象发送消息。你已经完成了这个对象,你可以对nil
说出你想要的任何内容,不会造成任何伤害。
答案 1 :(得分:2)
两件事
dealloc
对象而崩溃。release
发送到对象doesn't have any effect
根据你正在做的 ,你可以将对象指针设置为nil 来区分GC是否会收获对象与否。答案 2 :(得分:0)
由于将消息发送到nil对象是Objective-C中的有效操作(没有任何反应),因此如果在释放对象后发送消息,则将对象指针设置为nil可防止发生错误。
答案 3 :(得分:0)
除了其他回复之外,将发布的对象设置为nil
是很常见的,特别是当对象不是完全本地的(可能是另一个对象的成员)时。这使您可以轻松检查并查看之前是否已释放对象,以便在需要时再次创建它。