現代のObjective-Cのランタイムでは、あなたがこのような何かを行うことができますが:@synthesizedインスタンス変数を使用したくないのはいつですか?
@interface MyClass : NSObject {
}
@property NSString *stringProperty;
@end
@implementation MyClass
@synthesize stringProperty;
@end
これがないだけだろう、私のプロパティのアクセサを合成するだけでなく、インスタンス変数自体現代のランタイムと私の理解です、だから私はこのクラスのメソッド[stringProperty length];
の1つで言うことができ、ちょうど私がインスタンス変数を宣言したかのように動作します。
私はこれをすべてのコードで使い始めました。これは、何度も何度も何度も繰り返し書く必要があるからです。そして、私はclang 2.0コンパイラについて聞いたことがありますが、@synthesize
をスキップすることもできます(ただしそれは別の問題です)。しかし、私は疑問に思っていました、これを行うことの欠点のいくつかは何ですか?私のプロパティに本当にインスタンス変数が必要なのはいつですか?
変数をプライベートにして外部にアクセスしたくない場合がありますが(通常は私のプライベートクラス拡張でプロパティを宣言するだけです)、またはプロパティを作成しませんすべて、私はそれのアクセサを必要としない場合)。
私はこれをしたくない場合がありますか?
@joeはい、プロパティを宣言して上記のように合成しても、ivarを明示的に宣言しないと、コンパイラは実際にivarを作成します。だからクラス内で期待しているように 'int len = [self.stringProperty length]'を実行することもできますし、アクセッサメソッドを使わずに 'int len = [stringProperty length]'を行うこともできます。 ivar(コンパイラがsetter + getterと共に私のために合成したもの)。本当に素晴らしいです! – jbrennan
@joe XCode4が現在アプリケーションデリゲートのために生成しているスタブを調べることでこれについて知りました。 –