在调用@property
时,在Objective-C中使用下划线和self
关键字有区别吗?
财产申报:
@property (weak, nonatomic) NSString *myString;
拨打wine 店@synthesize
电话:
@synthesize myString = _myString;
如果我想在代码中使用它,有什么区别吗?什么时候在盖特/塞特?
self.myString = @"test";
_myString = @"test";
在调用@property
时,在Objective-C中使用下划线和self
关键字有区别吗?
财产申报:
@property (weak, nonatomic) NSString *myString;
拨打wine 店@synthesize
电话:
@synthesize myString = _myString;
如果我想在代码中使用它,有什么区别吗?什么时候在盖特/塞特?
self.myString = @"test";
_myString = @"test";
self.myString = @"test";
完全等同于写[self setMyString:@"test"];
.这两个都在调用一个方法.
你可以自己写这个方法.它可能看起来像这样:
- (void)setMyString:(NSString*)newString
{
_myString = newString;
}
因为您使用了@synthesize
,所以实际上不必费心编写该方法,只需允许编译器为您编写即可.
所以,从这个方法来看,调用它就像给实例变量赋值一样,对吗?其实没那么简单.
首先,您可以编写自己的setter方法.如果你这样做,你的方法就会被调用,它可以做各种额外的事情,以及设置变量.在这种情况下,使用self.myString =
将调用您的方法,但使用_myString =
则不会,因此将使用不同的功能.
其次,如果你使用键值观察,编译器会做一些非常巧妙的技巧.在幕后,它对类进行子类化,并重写setter方法(无论是您自己编写的方法还是由synthesis生成的方法),以便调用键值观察工作所需的willChangeValueForKey:
.你不需要知道这是怎么回事(尽管如果你想在睡前阅读的话,这很有趣!),但您确实需要知道,如果希望键值观察自动工作,就必须使用setter方法.
第三,调用setter方法,即使您依赖于synthesis来编写一个方法,也会为您的future 提供灵活性.每当一个值被更改时,你可能想做一些额外的事情,当你发现你想这么做时,你可以手动编写一个setter方法——如果你习惯于总是使用self.myString =
,那么你就不需要更改代码的其余部分来开始调用新方法了!
第四,这同样适用于子类.如果其他人要对您的代码进行子类化,如果您使用setter,那么他们可以覆盖它们来调整功能.
任何时候直接访问实例变量时,都没有明确地提供一种在该点上连接额外功能的方法.由于您或其他人将来可能希望使用此类功能,所以始终使用setter是值得的,除非有充分的理由不这样做.