self.myString = @"test";
は、 を書くこととまったく同じ[self setMyString:@"test"];
です。これらは両方ともメソッドを呼び出しています。
あなたはそのメソッドを自分で書くことができたでしょう。次のようになります。
- (void)setMyString:(NSString*)newString
{
_myString = newString;
}
を使用したため@synthesize
、実際にそのメソッドを記述する必要はありません。コンパイラにそれを記述させることができます。
そのメソッドを見ると、それを呼び出すとインスタンス変数に値を代入するのとまったく同じことが行われるように見えますよね? まあ、それはそれほど単純ではありません。
まず、独自のセッター メソッドを作成できます。そうすると、メソッドが呼び出され、変数の設定だけでなく、あらゆる種類の追加処理を実行できます。その場合、使用self.myString =
するとメソッドが呼び出されますが、実行すると呼び出さ_myString =
れないため、別の機能が使用されます。
次に、Key Value Observing を使用したことがある場合、コンパイラは非常に巧妙なトリックを実行します。舞台裏では、クラスをサブクラス化し、setter メソッド (自分で作成したものか、synthesize によって生成されたものかに関係なく) をオーバーライドして、willChangeValueForKey:
Key Value Observing が機能するために必要な呼び出しを行います。これがどのように機能するかを知る必要はありません (就寝前の読書が必要な場合は非常に興味深いですが!)、Key Value Observing を自動的に機能させたい場合は、setter メソッドを使用する必要があることを知っておく必要があります。
第 3 に、セッター メソッドを作成するために合成に依存している場合でも、セッター メソッドを呼び出すと、将来の柔軟性が得られます。値が変更されるたびに何か特別なことをしたい場合があり、それをしたいことがわかった時点で、setter メソッドを手動で書くことができます。常に を使用する習慣がある場合は、self.myString =
その必要はありません。コードの残りの部分を変更して、新しいメソッドの呼び出しを開始します。
第 4 に、同じことがサブクラスにも当てはまります。他の誰かがあなたのコードをサブクラス化する場合、セッターを使用すると、セッターをオーバーライドして機能を調整できます。
インスタンス変数に直接アクセスするときはいつでも、その時点で追加機能をフックする方法を明示的に提供していません。あなたや他の誰かが将来そのような機能をフックしたいと思うかもしれないので、そうしない正当な理由がない限り、常にセッターを使用することは有益です。