@propertyがObjective-cでgetterとsetterを生成することがわかりました。しかし、私は、それぞれの@propertyで属性を宣言するいくつかのクラスを見てきましたが、属性と継ぎ目を持たない@propertyでは、同じように動作します。違いはなんですか?objective-cの属性と@propertyの宣言の差
答えて
@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
を省略することができ、コンパイラは限り、あなたは明示的にゲッターやセッターを作成していないとして、あなたのためにそれを置く、あなたに少し混乱します。非アトミック、読み書き、読み取り専用、ゲッター= 名、セッター= 名、強い、弱いコピーを保持する、割り当てる:
、あなたがプロパティ宣言に接続できる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つを弱くしたい参照。
コピーは保持されますか?保持カウントをインクリメントするのに十分な 'copy'呼び出しはありませんか? – samson
- 1. __init__と@propertyでクラス属性を宣言する
- 2. メソッドのカスタム属性宣言
- 3. 目的C:@property宣言とインスタンス変数の宣言
- 4. iOS 5.1:IBOutletインスタンス変数と@property宣言
- 5. [テスト]と[テスト()]のNunitメソッドとクラス属性の宣言の違い
- 6. クラス属性宣言:プライベートvs公開
- 7. 属性warn_unused_resultで宣言[-Wunused-result]
- 8. phpstorm:autocompletion、__construct、および@property宣言
- 9. 派生クラスの属性宣言の強制
- 10. angular2モデルの日付属性を宣言する方法
- 11. python宣言属性パターンの呼び出し方法
- 12. 辞書からPythonのクラス属性を宣言する
- 13. Java- HTMLファイルの属性を宣言する方法は?
- 14. XSD要素の名前空間属性を宣言する
- 15. onload属性の変数を宣言できません
- 16. 特性宣言の型コンストラクタ
- 17. メタタグ内の属性property = "og:title"とは何ですか?
- 18. Objective-C:実装なしの@property宣言(@synthesize)
- 19. シングルトンクラスを保持するのに@property宣言が最適
- 20. 宣言と宣言の順序
- 21. クラス宣言とインスタンス宣言の型キーワード
- 22. styles.xmlファイルのすべてのボタンに共通のonClick属性を宣言する
- 23. 型宣言の重要性、nilの値
- 24. 関数の先頭で宣言された変数と後で宣言された変数の差
- 25. グローバル属性...既に宣言されています
- 26. XMLで属性IDを宣言する方法
- 27. EnumTypeで属性を宣言する方法
- 28. 'class'属性が宣言されていません
- 29. バージョン0.9.1でユーザー定義属性を宣言する方法
- 30. 'layout_bellow'属性が宣言されていません
[この回答](http://stackoverflow.com/questions/4076836/how-do-automatic-synthesized-ivars-affect-the-real-sizeofmyclass)が役立ちます。 – trudyscousin