2012-04-18 8 views
4

@propertyがObjective-cでgetterとsetterを生成することがわかりました。しかし、私は、それぞれの@propertyで属性を宣言するいくつかのクラスを見てきましたが、属性と継ぎ目を持たない@propertyでは、同じように動作します。違いはなんですか?objective-cの属性と@propertyの宣言の差

+0

[この回答](http://stackoverflow.com/questions/4076836/how-do-automatic-synthesized-ivars-affect-the-real-sizeofmyclass)が役立ちます。 – trudyscousin

答えて

7

@propertyがObjective-cでゲッターとセッターを生成することは知っています。

いいえ。 @propertyは、ゲッターであり、オプションでセッター(読み込み/書き込みプロパティ用)であるプロパティーをと宣言します。 getterとsetterの生成は、実装時に(またはgetterとsetterを書くことによって)@synthesizeによって行われます。

しかし、私は、彼らがそれぞれの@property

持つ属性は、あなたがこのように意味するか宣言するいくつかのクラスを見てきましたか?あなた@synthesizeプロパティあれば、あなたはインスタンス変数の宣言を残すことができますし、コンパイラはあなたのためにそれを置く現代のObjective-Cランタイムで

@interface Foo : NSObject 
{ 
    Bar* anAttribute; // <<=== this is an instance variable 
} 

@property (retain) Bar* anAttribute; 

@end 

、。明示的にインスタンス変数を宣言するかどうかは、個人的な好みの問題です。


ただ非常に最新のコンパイラでは、あなたが@synthesizeを省略することができ、コンパイラは限り、あなたは明示的にゲッターやセッターを作成していないとして、あなたのためにそれを置く、あなたに少し混乱します。非アトミック、読み書き、読み取り専用、ゲッター= 、セッター= 、強い、弱いコピーを保持する、割り当てる:

IOS 5.0の下で
+0

本当ですか?どのコンパイラで合成文を省略できますか? – Moshe

+0

@Moshe:それは明らかにXcode 4.4にあります。 http://lists.apple.com/archives/objc-language/2012/Apr/msg00037.html – JeremyP

+0

大きな楽しい説明 – RollRoll

5

、あなたがプロパティ宣言に接続できる10種類の属性があります。 (strong、weakはiOS 5.0の新機能であり、ARCを使用する場合にのみ意味があります)。

nonatomicは、可変アクセスがではなく、マルチスレッド同時アクセスから保護されることを宣言します。これはデフォルトではありませんが、99%の時間が必要です(この保護により、マルチスレッドを実行していない場合にはコードの実行が遅くなりません)。

readwrite/readonlyはかなり明白でなければなりません。readwriteがデフォルトです。読み込み専用のプロパティを宣言すると、セッターはありません。

getter =、setter = getter &セッターメソッドを呼び出す必要があるかどうかを制御します。それらを省略すると、それぞれプロパティ名と呼ばれ、*プロパティ名*が設定されます。

残りの属性(強、弱、保持、コピー、割り当て)はメモリマネージャへのヒントであり、それらの動作はARCを使用しているかどうかによって異なります。そうでない場合、 "retain"プロパティは、参照先となるオブジェクト上にが自動的にを保持するようにセッターメソッドに通知するように指示します。つまり、デアロケータでのリリースも呼び出す必要があります。

"assign"プロパティは、として呼び出さないように設定します。オブジェクトが別のオブジェクトによって解放された場合、このポインタはダングリングのままになります。

"copy"プロパティは、を保持してを呼び出し、プロパティのコピーを作成するように設定します。これはNSDictionaryを取得し、呼び出し元にインスタンスを渡させたくない場合に便利ですNSMutableDictionaryの内容を変更し、内容をあなたの下から変更してください。

ARCを使用している場合、通常は「強」または「弱」のみを設定します。 (強いものは保持の同義語なので、互換的に使用できます)。 "強い"はあなたに変数を保持するようにARCに指示します - "弱い"はそうしないように指示します。 「弱い」は、オブジェクトAがオブジェクトBとオブジェクトAを参照する潜在的な「保持サイクル」を持つ場合に便利です。両方がお互いに残っている場合、メモリリークが発生しているため、そのうちの1つを弱くしたい参照。

+0

コピーは保持されますか?保持カウントをインクリメントするのに十分な 'copy'呼び出しはありませんか? – samson

関連する問題