_与自我之间的区别。 在Objective-C _与自我之间的区别。 在Objective-C

2019-05-13 16:09发布

是否有使用下划线和使用之间的差异self调用一个关键词时,在Objective-C @property

财产申报:

@property (weak, nonatomic) NSString *myString;

调用@synthesize的财产:

@synthesize myString = _myString;

是否有区别,如果我想在我的代码中使用它? 什么时候? 在的getter / setter?

self.myString = @"test";
_myString = @"test";

Answer 1:

self.myString = @"test"; 是完全等同于写[self setMyString:@"test"]; 。 上述这些问题都调用一个方法。

你本可以自己编写的方法。 它可能是这个样子:

- (void)setMyString:(NSString*)newString
{
    _myString = newString;
}

因为你使用@synthesize ,你不必费心实际编写方法,你可以让编译器把它写你。

因此,从看那个方法,它看起来像调用它会做同样的事情刚刚值分配给实例变量,对不对? 好吧,它不是那么简单。

首先,你可以写你自己的setter方法。 如果你这样做,你的方法将被调用,它可以做各种各样的其他注意事项,以及设置变量。 在这种情况下,使用self.myString =会打电话给你的方法,但这样做_myString =不会,所以有不同的功能将被使用。

其次,如果你曾经使用核心价值观测,编译器做了一些非常聪明的技巧。 在幕后,它的子类类,并覆盖您的setter方法(不管它是一个你自己写或者一个通过合成产生的),为了使呼叫willChangeValueForKey:观察工作所需要的核心价值。 你不需要知道它是如何工作(但如果你想要一些睡前阅读这是相当有趣!),但你需要知道,如果你想键值观察自动工作,你必须使用setter方法。

第三,呼吁即使你依靠合成写一个setter方法让你对未来的灵活性。 每当值改变您可能需要做些额外的事情,在你发现你想要做到这一点的时候,你可以手动编写setter方法-如果你的习惯,你总是使用self.myString = ,那么你不需要改变你的代码的其余部分,开始调用新的方法!

第四,同样适用于子类。 如果别人是继承你的代码,如果你使用的制定者则他们可以超越他们调整功能。

您可以直接访问实例变量的任何时候,你没有明确提供额外的功能,在这一点上被钩住的方式。 既然你或其他人可能想在这样的功能钩在未来,它支付使用制定者所有的时间,除非有一个很好的理由不这样做。



Answer 2:

你是正确的-第一个版本( self.myString )调用合成的getter / setter和私有成员变量直接在第二个版本的访问。

它看起来像你正在使用ARC,所以在这种情况下,它没有太大的差别。 但是,如果你不使用ARC,它可以有所作为的分配给私有成员直接将不会触发自动保留/释放或复制/是通过使用为您生成发布的逻辑synthesize



Answer 3:

_ (下划线)是一个简单的约定,在解释这个问题 。

当你没有前缀的属性访问self. ,你是直接访问底层的变量,如AC struct 。 在一般情况下,你应该永远只能做你的init方法和自定义属性访问器。 这样的东西像计算性能和KVC像预期的那样。



Answer 4:

有一个尖不mentionend,使用下划线的访问速度更快,并采用自主访问是安全的(KVC)。 也许当你必须使用每一个这样可以总结。



文章来源: Difference between _ and self. in Objective-C