Ios 和自我之间的区别。在Objective-C中

Ios 和自我之间的区别。在Objective-C中,ios,objective-c,getter-setter,synthesize,Ios,Objective C,Getter Setter,Synthesize,调用@property时,在Objective-C中使用下划线和使用self关键字是否有区别 财产申报: @property (weak, nonatomic) NSString *myString; 对属性调用@synthesis: @synthesize myString = _myString; 如果我想在代码中使用它,有什么区别吗?什么时候在盖特/塞特 self.myString = @"test"; _myString = @"test"; 您是正确的-第一个版本(self.my

调用
@property
时,在Objective-C中使用下划线和使用
self
关键字是否有区别

财产申报:

@property (weak, nonatomic) NSString *myString;
对属性调用
@synthesis

@synthesize myString = _myString;
如果我想在代码中使用它,有什么区别吗?什么时候在盖特/塞特

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

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

看起来您使用的是ARC,所以在这种情况下,它没有太大的区别。但是,如果您不使用ARC,则可能会有所不同,因为直接分配给私有成员不会触发通过使用
synthesis
self.myString=@“test”为您生成的自动保留/释放或复制/释放逻辑
完全等同于编写
[self-setMyString:@“test”]。它们都在调用一个方法

你可以自己写这个方法。它可能看起来像这样:

- (void)setMyString:(NSString*)newString
{
    _myString = newString;
}
因为您使用了
@synthesis
,所以实际上不必费心编写该方法,您只需允许编译器为您编写它即可

所以,从这个方法来看,调用它就像给实例变量赋值一样,对吗?其实没那么简单

首先,您可以编写自己的setter方法。如果您这样做,您的方法将被调用,它可以执行各种附加操作以及设置变量。在这种情况下,使用
self.myString=
将调用您的方法,但执行
\u myString=
则不会,因此将使用不同的功能

其次,如果您使用键值观察,编译器会做一些非常巧妙的技巧。在幕后,它对类进行子类化,并重写setter方法(无论是您自己编写的方法还是由synthesis生成的方法),以便调用键值观察工作所需的
willChangeValueForKey:
。您不需要知道这是如何工作的(尽管如果您想在睡前阅读,这很有趣!),但您需要知道,如果您想让键值观察自动工作,您必须使用setter方法

第三,调用setter方法,即使您依赖于synthesis来编写一个方法,也可以为将来提供灵活性。每当值发生更改时,您可能需要执行一些额外的操作,当您发现需要执行这些操作时,您可以手动编写setter方法-如果您习惯于总是使用
self.myString=
,那么您就不需要更改代码的其余部分来开始调用新方法了

第四,这同样适用于子类。如果其他人要对您的代码进行子类化,如果您使用setter,那么他们可以覆盖它们来调整功能

任何时候直接访问实例变量时,都没有明确提供一种在该点上连接额外功能的方法。由于您或其他人将来可能希望使用此类功能,因此始终使用setter是值得的,除非有充分的理由不使用


如果不在属性访问前面加上
self.
,则直接访问底层变量,就像在c
结构中一样。通常,您应该只在init方法和自定义属性访问器中执行此操作。这使得诸如计算属性之类的东西能够按预期工作。

有一个提示,使用下划线访问更快,使用self访问更安全(KVC)。当你必须使用每一个的时候,这可能是一个总结。

self
是一个符号<代码>u
是某些符号中的字符
myString
\u myString
是两个碰巧相关的不同符号,不是因为拼写问题,而是因为它们的名称相同。
@synthezize
。请尝试以下答案:检查@Jonathan对前一个问题的回答是否有帮助,因为据我所知same@AalokParikh--如果您认为它们是相同的,请尝试
[instancePtr set_myString:@“ABC”]
它们是两个不同的符号。一个可能是“aardvark”,另一个可能是“zebra”,但仍然具有变量setter/getter关系。@Hot Licks-您认为名称不相关是正确的,但当我阅读问题时,我想他在想,使用合成属性与仅使用支持它的成员变量之间的实际区别是什么。@EricPetroleje-是的,这正是我所问的。谢谢请注意,我没有提到内存管理的含义。如果你用的是ARC,它们在这个例子中就没有那么重要了,所以我跳过了它们。顺便说一下,关于第一句。。。这在99%的情况下都是正确的,但是如果您有一个自定义setter(在属性声明中用
setter=
指定),那么这两种形式并不完全相同。