self.myString = @"test";
完全等同于写作[self setMyString:@"test"];
。这两个都在调用一个方法。
您可以自己编写该方法。它可能看起来像这样:
- (void)setMyString:(NSString*)newString
{
_myString = newString;
}
因为您使用@synthesize
了 ,所以您实际上不必费心编写该方法,您可以让编译器为您编写它。
因此,从查看该方法来看,调用它似乎与为实例变量赋值完全相同,对吧?好吧,这不是那么简单。
首先,您可以编写自己的 setter 方法。如果你这样做,你的方法会被调用,它可以做各种额外的事情以及设置变量。在这种情况下, usingself.myString =
将调用您的方法,但 do_myString =
不会,因此将使用不同的功能。
其次,如果你曾经使用过 Key Value Observing,编译器会做一些非常聪明的技巧。在幕后,它继承了您的类,并覆盖了您的 setter 方法(无论是您自己编写的还是通过综合生成的),以便willChangeValueForKey:
对 Key Value Observing 工作所需的调用进行调用。你不需要知道它是如何工作的(虽然如果你想睡前阅读它会很有趣!),但你需要知道如果你想让 Key Value Observing 自动工作,你必须使用 setter 方法。
第三,即使您依赖 synthesize 来编写 setter 方法,也可以调用该方法,这为您未来提供了灵活性。每当值更改时,您可能想要做一些额外的事情,并且当您发现您想要这样做时,您可以手动编写一个 setter 方法 - 如果您习惯于始终使用self.myString =
,那么您将不需要更改其余代码以开始调用新方法!
第四,同样适用于子类。如果其他人要对您的代码进行子类化,如果您使用设置器,那么他们可以覆盖它们以调整功能。
每当您直接访问实例变量时,您都没有明确地提供一种方法来连接额外的功能。由于您或其他人将来可能想要挂钩此类功能,因此一直使用 setter 是值得的,除非有充分的理由不这样做。