是否有使用下划线和使用之间的差异self
调用一个关键词时,在Objective-C @property
?
财产申报:
@property (weak, nonatomic) NSString *myString;
调用@synthesize
的财产:
@synthesize myString = _myString;
是否有区别,如果我想在我的代码中使用它? 什么时候? 在的getter / setter?
self.myString = @"test";
_myString = @"test";
self.myString = @"test";
是完全等同于写[self setMyString:@"test"];
。 上述这些问题都调用一个方法。
你本可以自己编写的方法。 它可能是这个样子:
- (void)setMyString:(NSString*)newString
{
_myString = newString;
}
因为你使用@synthesize
,你不必费心实际编写方法,你可以让编译器把它写你。
因此,从看那个方法,它看起来像调用它会做同样的事情刚刚值分配给实例变量,对不对? 好吧,它不是那么简单。
首先,你可以写你自己的setter方法。 如果你这样做,你的方法将被调用,它可以做各种各样的其他注意事项,以及设置变量。 在这种情况下,使用self.myString =
会打电话给你的方法,但这样做_myString =
不会,所以有不同的功能将被使用。
其次,如果你曾经使用核心价值观测,编译器做了一些非常聪明的技巧。 在幕后,它的子类类,并覆盖您的setter方法(不管它是一个你自己写或者一个通过合成产生的),为了使呼叫willChangeValueForKey:
观察工作所需要的核心价值。 你不需要知道它是如何工作(但如果你想要一些睡前阅读这是相当有趣!),但你需要知道,如果你想键值观察自动工作,你必须使用setter方法。
第三,呼吁即使你依靠合成写一个setter方法让你对未来的灵活性。 每当值改变您可能需要做些额外的事情,在你发现你想要做到这一点的时候,你可以手动编写setter方法-如果你的习惯,你总是使用self.myString =
,那么你不需要改变你的代码的其余部分,开始调用新的方法!
第四,同样适用于子类。 如果别人是继承你的代码,如果你使用的制定者则他们可以超越他们调整功能。
您可以直接访问实例变量的任何时候,你没有明确提供额外的功能,在这一点上被钩住的方式。 既然你或其他人可能想在这样的功能钩在未来,它支付使用制定者所有的时间,除非有一个很好的理由不这样做。
你是正确的-第一个版本( self.myString
)调用合成的getter / setter和私有成员变量直接在第二个版本的访问。
它看起来像你正在使用ARC,所以在这种情况下,它没有太大的差别。 但是,如果你不使用ARC,它可以有所作为的分配给私有成员直接将不会触发自动保留/释放或复制/是通过使用为您生成发布的逻辑synthesize
。
该_
(下划线)是一个简单的约定,在解释这个问题 。
当你没有前缀的属性访问self.
,你是直接访问底层的变量,如AC struct
。 在一般情况下,你应该永远只能做你的init方法和自定义属性访问器。 这样的东西像计算性能和KVC像预期的那样。
有一个尖不mentionend,使用下划线的访问速度更快,并采用自主访问是安全的(KVC)。 也许当你必须使用每一个这样可以总结。
文章来源: Difference between _ and self. in Objective-C