長く複雑な答え:
クラスフィールド、インタフェースのカッコ内のもの:
@interface MyClass : SomeSuperclass
{
int someNumber_; /* this stuff */
}
は、あなたのオブジェクトへの実際のバイトを追加。 Objective-Cクラスは実際には、すべてのfluffの下にあり、大規模なCの構造体です。これらはその構造体のフィールドです。 (->
スタイルのCポインタ構文でも得ることができますが、コンパイラは@public
がなくてもあなたに怒鳴りますが、これらのフィールドにアクセスする正しい方法は他の変数と同じように裸の名前です)
のようなプロパティ宣言:
@property (nonatomic, assign, readwrite) int someNumber;
があるOBJ-Cのようなメソッド宣言のペアの2.0速記:あなたのクラスに何も加えない
-(int)someNumber;
-(void)setSomeNumber:(int)newNumber;
。このクラスで実行できる操作がここにあることを世界に宣言するだけです。通常、このようなメソッドはフィールド値を取得して設定するか、少なくともフィールド値と同じように動作します。このような方法を使用すると、obj.prop
とobj.prop = val
のドット構文を使用して呼び出すことができます。
のsynthesizeディレクティブ:
@synthesize someNumber;
は、必要に応じて(つまり、「非アトミック、割り当てる」もので通知)標準組み込み振る舞いを使用して、実行時に、あなたのためにこれらのメソッドを作成するには、とは、必要に応じて、同じのフィールドを作成します取得して設定する名前。 @synthesize someNumber = someNumber_;
のようなディレクティブは、作成されたフィールドに「someNumber_」という名前を付けます。上記のように@interfaceブロックにそのようなフィールドを宣言した場合は、そのフィールドが使用されます。それ以外の場合は、それ自身の適切なフィールドを静かに挿入します。この静かなフィールドの挿入は、4.xシミュレータ以降の新しい動作です。その前に、すべてのフィールドを@interface {}ブロックに宣言しなければなりません。
要約:@interface {...}は、オブジェクトの物理フィールドを記述します。 @property()...オブジェクトの使用方法を記述します。 @synthesizeは、基本的なgetter/setterを実装し、必要に応じて余分なフィールドを挿入するための省略形です。私は通常、フィールドを明示的に宣言する必要があるまで、通常@synthesizeにそのことをさせ、通常はデバッガでそれを見るために@interface {}ブロックを空のままにします。
[最新のSDKとしては、上記のうちのいくつかは日付です。特に、@synthesizeは現在オプションであり、.marsファイルの@implementation
にインスタンス変数を宣言できます。]
ありがとうrgeorge。すべてのものを財産にするには、それ以上のスペースが必要ですか? – Filo
"フィールド"はストレージ、 "プロパティ"はそれをどのように取得するかです。すべてのものをプロパティにして@synthesizeにフィールドの世話をさせることは完全に正当な方法ですが、合成されたアクセサメソッドを何か面白いものに置き換えるときは違いを知る必要があります。 – rgeorge