关于这篇文章: iPhone - dealloc - Release vs. nil
本文主要讨论在Objective-C中释放内存的两种方法:使用release和使用nil。在iOS 5之前,使用release是标准做法,但是在iOS 5及以后版本中,使用nil已经取代了release成为更好的选择。1) [foo release];
2) self.bar = nil;
以下是解释:
通过实例变量 bar 访问对象并将其释放。实例变量将变成悬空指针。这是在 dealloc 中的首选方法。
在 self 上将属性 bar 赋值为 nil,实际上会释放该属性当前所保留的任何内容。如果您有一个自定义 setter 用于清理支持属性的实例变量以外的其他内容,则应执行此操作。
请问有人可以澄清 #1 的解释吗?通过实例变量 bar 访问?
例如,我已在对象头中设置了一个私有变量:
SomeObject *oPointer;
我在头文件中没有使用属性设置器,因此在实例化对象时不会被合成。
在我的代码中,根据特定条件,稍后必须分配并将该指针分配给它的对象。
obj = [[SomeObject alloc] initWith....];
现在可以通过实例变量obj进行访问。我有一个UIButton,它被配置为重置这个对象,它附加的方法deallocs它。我是通过以下方式完成的:
[obj release];
obj = nil;
在解释了这么多之后,问题是,为什么我还需要声明obj = nil呢?似乎[obj release]调用也会使指针失效。我认为[obj release]会在一次操作中释放它所指向的内存并将obj设置为nil,但事实并非如此,因为在[obj release]之后尝试引用obj时我的应用程序会崩溃。
这个问题有意义吗?解释是否只是[obj release]执行所有清理操作,包括杀死指针,我需要注意这一点?
如果我为SomeObject指针设置保留属性,释放后指针是否仍然被保留?
提前感谢您的帮助!