gpt4 book ai didi

ios - _和 self 之间的区别。在 Objective-C 中

转载 作者:IT老高 更新时间:2023-10-28 11:35:37 32 4
gpt4 key购买 nike

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

属性(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 = 不会,因此会使用不同的功能。

其次,如果您曾经使用过 Key Value Observing,编译器会使用一些非常聪明的技巧。在幕后,它继承您的类,并覆盖您的 setter 方法(无论是您自己编写的还是通过综合生成的),以便调用键值所需的 willChangeValueForKey:观察工作。你不需要知道它是如何工作的(虽然如果你想睡前阅读它会很有趣!),但你需要知道如果你想让 Key Value Observing 自动工作,你必须使用 setter 方法。

第三,调用 setter 方法,即使您依赖 synthesize 编写一个,也可以为您 future 提供灵 active 。每当值更改时,您可能想要做一些额外的事情,并且当您发现自己想要这样做时,您可以手动编写一个 setter 方法 - 如果您习惯于始终使用 self.myString = ,那么您无需更改其余代码即可开始调用新方法!

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

当您直接访问实例变量时,您并没有明确地提供一种方法来连接额外的功能。由于您或其他人将来可能想要 Hook 此类功能,因此始终使用 setter 是值得的,除非有充分的理由不这样做。

关于ios - _和 self 之间的区别。在 Objective-C 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10333495/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com