在调用@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是值得的,除非有充分的理由不这样做.

Objective-c相关问答推荐

将 NSInteger 转换为 NSIndexpath

OCUnit 的单元测试示例

如何声明仅调试语句

如何追踪 SIGABRT 的原因

多个(两个)持久存储可以与一个对象模型一起使用,同时保持一个到另一个的关系吗?

将 Objective-C 指针类型NSString *转换为 C 指针类型CFStringRef(又名const struct __CFString *)需要桥接转换

无法编译连接:错误是什么意思?

UIDatePicker,根据今天的日期设置最大和最小日期

iOS7过度导航栏按钮填充

.delegate=self 是什么意思?

如何更改 UICollectionView 中的滚动方向?

iOS - 从应用程序获取 CPU 使用率

Electron邮件镇静 iOS 8

Core Text在iOS中计算字母框架

Objective-c 中 SEL 类型的属性

Objective-c 2.0 中的可选参数?

Xcode - 如何将 XIB 连接到 ViewController 类

iPhone UILabel 文字软阴影

将自定义子视图(在 xib 中创建)添加到视图控制器的视图 - 我在做什么错

即使在静音模式下也能在 iPhone 上播放声音