ARCを使用して、ObjCクラスのゲッターとセッターをオーバーライドします。
.hファイル
@property (retain, nonatomic) Season *season;
.mファイル
@synthesize season;
- (void)setSeason:(Season *)s {
self.season = s;
// do some more stuff
}
- (Season *)season {
return self.season;
}
ここに何かが足りませんか?
うん、それらは無限の再帰ループです。なぜなら
self.season = s;
コンパイラーにより
[self setSeason:s];
そして
return self.season;
に翻訳されています
return [self season];
dot-accessorself.
を取り除くと、コードは正しくなります。
ただし、この構文は、プロパティseason
と変数season
が同じ名前を共有しているため、混乱を招く可能性があります(ただし、Xcodeはこれらのエンティティに異なる色を付けることで混乱をいくらか軽減します)。次のように記述することにより、変数名を明示的に変更することができます。
@synthesize season = _season;
または、さらに良いことに、@synthesize
ディレクティブを完全に省略します。最新のObjective-Cコンパイラは、アクセサメソッドとインスタンス変数を自動的に合成します。
独自のゲッターとセッターを実装する場合は、内部変数を維持する必要があります。
@synthesize season = _season;
- (void)setSeason:(Season *)s {
// set _season
//Note, if you want to retain (as opposed to assign or copy), it should look someting like this
//[_season release];
//_season = [s retain];
}
- (Season *)season {
// return _season
}
不足しているのは、Objective-Cコンパイラが基本的にself.foo = bar
構文を[self setFoo:bar]
、およびself.foo
into [self foo]
。現在実装されているメソッドは、自分自身を呼び出しています。 Jeremyが提案しているように、セッターが呼び出した値を実際にクラスのインスタンス変数に割り当て、ゲッターがそのインスタンス変数の値を返すように実装する必要があります。