我经常看到当我们释放ab对象时,我们立即将其设置为nil。我知道release和nil都释放了与object相关的旧值,但是在释放的情况下,它将对象保留为悬空指针,所以我们必须将它设置为nil。
所以我的问题是,如果nil释放了对象的旧值并将对象设置为nil为什么我们不应该只使用nil为什么w也应该使用release。
WAY1:
MyClass *obj = [[MyClass alloc] init];
[obj release];
obj = nil;
Way2:
MyClass *obj = [[MyClass alloc] init];
obj = nil;
如果使用way1,为什么不仅仅使用way2,way1和way2的真正区别是什么?
答案 0 :(得分:11)
将指针设置为nil不会释放该指针的前一个目标所占用的内存。用简单的英语,将它指定为nil 不释放它。
如果您的应用程序是垃圾收集的,那么发布是无操作的,可以省略。否则,这是非常非常必要的。因此,方式1始终是正确的,并且方式2仅在垃圾收集下是正确的。
注意:此答案不适用于使用自动引用计数的项目。在ARC下,将指针设置为nil 会向对象发送一个版本。
答案 1 :(得分:1)
正如BJ所说,将其设置为nil不会释放内存,并且在非gc收集的环境中会导致内存泄漏。另一种可能有效的替代方案是
MyClass *obj = [[[MyClass alloc] init] autorelease];
obj = nil;