@synthesize
コードに明示的に追加する必要があるのはいつですか?
通常、必要な場合: 必要なケースに遭遇することはおそらくないでしょう。
ただし、役立つ場合が 1 つあります。
カスタムの getter と setter の両方を作成していて、インスタンス変数でそれをサポートしたいとします。(アトミック プロパティの場合、これはカスタム セッターが必要なのと同じくらい簡単です。単原子プロパティのセッターを指定し、アトミック プロパティを指定しない場合、コンパイラはゲッターを書き込みます。)
このことを考慮:
@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
つまり、synthesize は実際には決して必要ではありませんが*、getter/setter を提供するときにプロパティ バッキング インスタンス変数を定義するために使用できます。ここで、使用するフォームを決定できます。
以前は、 でインスタンス変数を指定することを好んでいましたが、冗長な型を削除し、バッキング変数をプロパティに明示的に関連付けるため、ルートの方が適切な選択である@implementation {}
と考えています。@synthesize
- プロパティの型を変更すると、インスタンス変数の型が変更されます。
- そのストレージ修飾子を変更すると (たとえば、strong の代わりに weak にするか、weak の代わりに strong にする)、ストレージ修飾子が変更されます。
- プロパティを削除または名前変更すると
@synthesize
、コンパイラ エラーが発生します。迷子のインスタンス変数になってしまうことはありません。
*-複数のファイルのカテゴリ間で機能を分割することに関連して、必要なケースを 1 つ知っています。そして、Apple がこれを修正したとしても、あるいはすでに修正したとしても、私は驚かないでしょう。