@propertyがObjective-cでゲッターとセッターを生成することを知っています。しかし、それぞれの@propertyで属性を宣言するクラスや、同じように機能する属性とシームのない@propertyだけを宣言するクラスを見たことがあります。違いは何ですか?
2 に答える
@propertyがObjective-cでゲッターとセッターを生成することを知っています。
いいえ、しません。 ゲッターおよびオプションでセッター(読み取り/書き込みプロパティ用)であるプロパティを@property
宣言します。ゲッターとセッターの生成は@synthesize
、実装内で(または、ゲッターとセッターを作成することによって)行われます。
しかし、それぞれの@propertyで属性を宣言するクラスをいくつか見ました。
こういう意味ですか?
@interface Foo : NSObject
{
Bar* anAttribute; // <<=== this is an instance variable
}
@property (retain) Bar* anAttribute;
@end
最新のObjective-Cランタイムでは@synthesize
、プロパティを使用する場合、インスタンス変数宣言を省略でき、コンパイラーがそれを自動的に配置します。インスタンス変数を明示的に宣言するかどうかは、個人的な好みの問題です。
少し混乱させるために、最新のコンパイラでは、を省略でき@synthesize
ます。明示的にゲッターまたはセッターを作成していない限り、コンパイラはそれを挿入します。
iOS 5.0では、プロパティ宣言にアタッチできる10の異なる属性があります。nonatomic、readwrite、readonly、getter = name、setter = name、strong、retain、copy、weak、assignです。(strong、weakはios 5.0の新機能であり、ARCを使用する場合にのみ意味があります)。
nonatomicは、可変アクセスをマルチスレッド同時アクセスから保護してはならないことを宣言します。これはデフォルトではありませんが、99%の場合は必要なものです(この保護によりコードの実行が遅くなり、マルチスレッドを実行していない場合はメリットがないため)。
readwrite / readonlyはかなり明白なはずです-readwriteがデフォルトであり、プロパティをreadonlyと宣言した場合、セッターはありません。
getter =、setter =は、getterメソッドとsetterメソッドの呼び出し対象を制御します。それらを省略すると、それぞれプロパティ名とセット*プロパティ名*と呼ばれます。
残りの属性(strong、weak、retain、copy、assign)はメモリマネージャーへのヒントであり、それらの動作はARCを使用しているかどうかによって異なります。そうでない場合、「retain」プロパティは、参照を取得するオブジェクトに対してretainを自動的に呼び出すようにsetterメソッドに指示します。これは、deallocatorでreleaseも呼び出す必要があることを意味します。
「assign」プロパティは、保持を呼び出さないようにセッターに指示します。そのため、オブジェクトが別のオブジェクトによって解放された場合、このポインターはぶら下がったままになる可能性があります。
「copy」プロパティは、setterにretainを呼び出し、プロパティのコピーを作成するように指示します。これは、たとえばNSDictionaryを取得し、呼び出し元がNSMutableDictionaryのインスタンスを渡して内容を変更したくない場合に便利です。あなたの下から出て。
ARCを使用している場合、通常は「強い」または「弱い」のみを設定します。(strongはretainの同義語であるため、同じ意味で使用できます)。「strong」はARCに変数を保持するように指示し、「weak」は保持しないように指示します。「weak」は、オブジェクトAがオブジェクトBとオブジェクトAを参照する潜在的な「保持サイクル」がある場合に役立ちます。両方が相互に保持している場合は、メモリリークが発生するため、一方を弱くする必要があります。参照。