我从人们那里听说你应该在viewDidUnload中使用self。例如,这很好:
- (void)viewDidUnload
{
self.object = nil;
self.object2 = nil
}
- (void)viewDidUnload
{
object = nil;
object2 = nil;
}
2之间有区别吗?它是什么?
答案 0 :(得分:10)
有区别。 @synthesize生成的代码将在设置新值之前调用对您拥有的对象的引用。对self.object = nil的调用将有效地释放引用并将其设置为nil。没有self,它只会将引用设置为nil。
答案 1 :(得分:3)
与你的第二个例子几乎相同的是:
- (void)viewDidUnload
{
[object release]; object = nil;
[object2 release]; object2 = nil;
}
注意它们并不完全相同 - 如果你定义了一个自定义的getter / setter,或者在其中一个属性周围设置了KVC观察者,self.object = nil
会触发它们,而直线[{{1}上面不会。
答案 2 :(得分:0)
首先,使用self
消除了歧义。
- (void)viewDidUnload
{
id object = @"whatever";
object = nil; // This refers to the local variable above
self.object = nil; // This refers to the setter of the ivar belonging to the class
}
另外需要注意的是,如果你合成了变量(意思是如果你告诉编译器自动生成getter& setter),self.object
将调用getter / setter,而只是object
}指的是实际的ivar。为了防止在访问ivar和调用setter时出现这种歧义,你可以这样写:
self->object = nil; // This refers to the ivar object, not the getter/setter
// Or
@synthesize object = _object; // With this, you refer to the ivar as _object
// Then somewhere else
_object = nil; // This refers to the ivar
object = nil; // Compile error, undeclared identifier
self.object = nil; // This refers to the setter
根据Cocoa编码指南,我们应该避免在命名变量中使用下划线。所以个人而言,如果我真的需要直接访问ivar(例如,当你覆盖setter时),我更喜欢使用->
。