iPhone:为什么我需要自己。<>在viewDidUnload中?

时间:2011-07-24 05:23:10

标签: iphone objective-c

我从人们那里听说你应该在viewDidUnload中使用self。例如,这很好:

- (void)viewDidUnload
{
   self.object = nil;
   self.object2 = nil
}


- (void)viewDidUnload
{ 
    object = nil;
    object2 = nil;
}

2之间有区别吗?它是什么?

3 个答案:

答案 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时),我更喜欢使用->