@synthesize
コードに明示的に追加する必要があるのはいつですか?
一般的に、それが必要な場合:あなたはおそらくそれが必要とされるケースにぶつかることは決してないでしょう。
ただし、便利な場合が1つあります。
カスタムゲッターとセッターの両方を作成しているが、それをバックアップするインスタンス変数が必要だとします。(アトミックプロパティの場合、これはカスタムセッターが必要な場合と同じくらい簡単です。アトミックプロパティではなく、モノアトミックプロパティにセッターを指定すると、コンパイラはゲッターを書き込みます。)
このことを考慮:
@interface MyObject:NSObject
@property (copy) NSString *title;
@end
@implementation MyObject
- (NSString *)title {
return _title;
}
- (void)setTitle:(NSString *)title {
_title = [title copy];
}
@end
_title
が存在しないため、これは機能しません。ゲッターまたはセッターの両方を指定したため、Xcodeは(正しく)そのバッキングインスタンス変数を作成しません。
それを存在させるには2つの選択肢があります。を次のように変更できます@implementation
。
@implementation MyObject {
NSString *_title;
}
- (NSString *)title {
return _title;
}
- (void)setTitle:(NSString *)title {
_title = [title copy];
}
@end
または、次のように変更します。
@implementation MyObject
@synthesize title = _title;
- (NSString *)title {
return _title;
}
- (void)setTitle:(NSString *)title {
_title = [title copy];
}
@end
言い換えると、合成は実用的な目的では決して必要ではありません*が、ゲッター/セッターを提供するときにプロパティバッキングインスタンス変数を定義するために使用できます。ここで使用するフォームを決定できます。
以前は、でインスタンス変数を指定することを好みましたが、冗長な型を削除し、バッキング変数をプロパティに明示的に関連付けるため@implementation {}
、@synthesize
ルートの方が適していると思います。
- プロパティのタイプを変更すると、インスタンス変数のタイプが変更されます。
- ストレージ修飾子を変更すると(たとえば、強いのではなく弱い、または弱いのではなく強い)、ストレージ修飾子が変更されます。
- プロパティを削除するか名前を変更
@synthesize
すると、コンパイラエラーが生成されます。漂遊インスタンス変数になってしまうことはありません。
*-複数のファイルのカテゴリ間で機能を分割することに関連して、それが必要だった1つのケースを知っています。そして、Appleがこれを修正したとしても、あるいはすでに修正したとしても、私は驚かないだろう。