想知道有经验的人能否更详细地解释一下这个问题。我已经看到过一些例子,但是我还是不太理解。
[view release];
view = nil;
....在 (void) dealloc 内部。
这两者有什么区别,哪种更好?什么是最好的方法?
在进行 retainCount 测试时,我个人见过 nil 使计数从3降至0,但 release 只将其从3降至2。
想知道有经验的人能否更详细地解释一下这个问题。我已经看到过一些例子,但是我还是不太理解。
[view release];
view = nil;
....在 (void) dealloc 内部。
这两者有什么区别,哪种更好?什么是最好的方法?
在进行 retainCount 测试时,我个人见过 nil 使计数从3降至0,但 release 只将其从3降至2。
你可能见过这些:
1) [foo release];
2) self.bar = nil;
3) baz = nil;
在dealloc
方法中,通过实例变量foo
来访问对象并释放它。这样做会使得实例变量成为一个悬空指针。
在自定义属性的setter方法中,给self上的属性 bar
赋值为nil
,会释放该属性当前持有的任何对象。如果属性的setter方法需要清理除了实例变量之外的其它资源,请使用这种方式。
将指向对象的指针baz
赋值为nil
,但不会释放该对象,导致内存泄漏。绝不要这样做。
如果您没有使用属性(其中self.property = nil也会释放对象),那么您应该始终在释放后跟随将引用设置为nil的代码,就像您所概述的一样:
[view release]; view = nil;
就使用代码而言,在您的dealloc
中,您不需要对属性进行赋值,只需要释放
即可。
- (void)dealloc {
[myProperty release]; // don't need to assign since you won't have the object soon anyway
[super dealloc];
}
我认为同时使用两者是一种安全保障。如果仅使用release
会在引用计数管理出现问题时导致运行问题。您将释放一个对象,将其内存返还给系统,但指针仍然有效。
使用nil
可以确保程序不会崩溃,因为向nil
发送消息不会有任何影响。
retain
或copy
并不会导致内存泄漏,因为它们在语义上都释放了属性之前引用的对象。唯一的区别是如何获得新值;ivar = [newValue retain];
与ivar = [newValue copy]
二者皆可,均使用[ivar release]
来释放旧值。 - PeyloWdealloc
方法的方法。安全使用属性/实例变量的一般规则是:init
、dealloc
和 setters/getters 中直接使用实例变量。