プロパティを宣言するときは、インスタンス変数のセッター/ゲッターを宣言します
いいえ、あなたはゲッターとおそらくプロパティのセッターを宣言しています。限目。プロパティの宣言自体は、インスタンス変数を意味するものではありません。プロパティを実装する方法はたくさんあります。インスタンス変数はたまたま一般的で一般的な方法ですが、非ivarプロパティは非常に一般的です。
セッターとゲッターを定義したい場合は、それらを合成する必要があります
いいえ。(セルヒオが指摘しているように、私はもともと「定義済み」と「宣言済み」を混同していました。)ほとんど。@property
行自体がセッターとゲッターを宣言します。セッターとゲッターを実装する場合、これは「合成」と呼ばれますが、手動で行う必要はありません。コンパイラーは、宣言したが実装していないプロパティに対してゲッターとセッターを自動的に作成します(明示的に使用しないように要求しない限り@dynamic
)。
合成する場合、インスタンス変数が定義されます。ベストプラクティスは、ゲッターとiVarが同じ名前にならないようにiVarの名前を変更することです。したがって、通常は次のようにします。@synthesize myVar = _myVar
ほとんど。これは数か月前に当てはまりましたが、実際にそれを行う必要はなくなりました@synthesize
。これで、コンパイラによって自動的に実行されます。
このヘッダー:
@interface MyObject : NSObject
@property (nonatomic, readwrite, strong) NSString *something;
@end
このヘッダーとほぼ同じです:
@interface MyObject : NSObject
- (NSString *)something;
- (void)setSomething:(NSString *)something;
@end
これら2つの間には非常に小さな違いがいくつかあり、ランタイムに関連するものとコンパイラに関連するものがありますが、同じふりをするだけでより明確になります。
これらの両方の場合に行っているのは、いくつかのメソッドを宣言することだけです。あなたはそれらがどのように実装されているかを宣言していません。あなたはivarsを宣言していません。メソッドを宣言しているだけです。これで、これらのメソッドを好きなように自由に実装できます。必要に応じて、コンパイラにデフォルトの実装を合成させることで、それらを実装できます。必要に応じて、手動で実装できます。必要に応じて、それぞれ1つずつ実行できます。