プロパティ宣言属性
@property(attribute [, attribute2, ...])の形式を使ってプロパティを属性で装飾することが できます。メソッドと同様に、プロパティの有効範囲はそれを囲んでいるインターフェイス宣言内で す。コンマ区切りの変数名リストを使うプロパティ宣言の場合、プロパティ属性は名前付きプロパ ティのすべてに適用されます。
コンパイラにアクセサメソッド(“プロパティの実装ディレクティブ” (72 ページ)を参照)の作成 を指定する@synthesizeディレクティブを使う場合、生成されるコードはキーワードによって指定さ れた仕様に合致します。アクセサメソッドを自身で実装する場合は、そのアクセサメソッドが仕様に 合致していることを確認する必要があります(たとえばcopyを指定した場合は、setterメソッドで入 力値をコピーしていることを確認する必要があります)。
アクセサメソッドの名前
プロパティに対応するgetterメソッドとsetterメソッドのデフォルトの名前は、それぞれpropertyName とsetPropertyName :です。たとえば、「foo」というプロパティの場合、アクセサメソッドはfoo と setFoo:になります。次の属性を使用すると、デフォルト名の代わりに独自の名前を指定できます。 これらの属性は両方とも任意です。また、ほかの任意の属性と一緒に使用できます(ただし、setter= はreadonlyと一緒には使用できません)。
プロパティがreadonlyの場合にsetter=でsetterも指定すると、コンパイラ警告が発生します。
通常、アクセサメソッドの名前には、キー値コーディングに準拠している名前を指定する必要があり ます(『Key-Value Coding Programming Guide 』を参照)。このgetterデコレータを使う一般的な理由 の1つには、ブール値のisPropertyName 規則に従うためです。
書き込み可能性
これらの属性は、プロパティがsetアクセサを持つかどうかを指定します。これらは排他的に使われま す。
2011-10-12 | © 2011 Apple Inc. All Rights Reserved. 69
@property(attribute [, attribute2, ...])の形式を使ってプロパティを属性で装飾することが できます。メソッドと同様に、プロパティの有効範囲はそれを囲んでいるインターフェイス宣言内で す。コンマ区切りの変数名リストを使うプロパティ宣言の場合、プロパティ属性は名前付きプロパ ティのすべてに適用されます。
コンパイラにアクセサメソッド(“プロパティの実装ディレクティブ” (72 ページ)を参照)の作成 を指定する@synthesizeディレクティブを使う場合、生成されるコードはキーワードによって指定さ れた仕様に合致します。アクセサメソッドを自身で実装する場合は、そのアクセサメソッドが仕様に 合致していることを確認する必要があります(たとえばcopyを指定した場合は、setterメソッドで入 力値をコピーしていることを確認する必要があります)。
アクセサメソッドの名前
プロパティに対応するgetterメソッドとsetterメソッドのデフォルトの名前は、それぞれpropertyName とsetPropertyName :です。たとえば、「foo」というプロパティの場合、アクセサメソッドはfoo と setFoo:になります。次の属性を使用すると、デフォルト名の代わりに独自の名前を指定できます。 これらの属性は両方とも任意です。また、ほかの任意の属性と一緒に使用できます(ただし、setter= はreadonlyと一緒には使用できません)。
getter=getterName
プロパティのgetアクセサの名前を指定します。getterはプロパティの型と一致する型を返し、パ
ラメータはとりません。
setter=setterName
プロパティのsetアクセサの名前を指定します。setterメソッドはプロパティの型と一致する型の
パラメータを1つとり、voidを返します。
プロパティがreadonlyの場合にsetter=でsetterも指定すると、コンパイラ警告が発生します。
通常、アクセサメソッドの名前には、キー値コーディングに準拠している名前を指定する必要があり ます(『Key-Value Coding Programming Guide 』を参照)。このgetterデコレータを使う一般的な理由 の1つには、ブール値のisPropertyName 規則に従うためです。
書き込み可能性
これらの属性は、プロパティがsetアクセサを持つかどうかを指定します。これらは排他的に使われま す。
2011-10-12 | © 2011 Apple Inc. All Rights Reserved. 69
宣言済みプロパティ
プロパティの宣言と実装
readwrite
プロパティを読み取り/書き込み可能として扱うべきであることを示します。この属性はデフォ ルトです。
@implementationブロックではgetterとsetterの両方のメソッドが必須です。実装ブロックで @synthesizeディレクティブを使う場合は、getterメソッドとsetterメソッドが合成されます。
readonly
setterのセマンティクス これらの属性は、setアクセサのセマンティクスを指定します。これらは排他的に使われます。
strong
copy
assign
setterで、単純代入を使用することを指定します。この属性はデフォルトです。
この属性は、NSInteger、CGRectなどのスカラ型に使います。 retain
代入時にオブジェクトに対してretainを呼び出す必要があることを指定します 以前の値にはreleaseメッセージが送信されます。
OS X v10.6以降では、__attribute__キーワードを使用して、メモリ管理においてCore Foundation プロパティをObjective-Cオブジェクトのように扱うように指定できます。
2011-10-12 | © 2011 Apple Inc. All Rights Reserved. 70
プロパティの宣言と実装
readwrite
プロパティを読み取り/書き込み可能として扱うべきであることを示します。この属性はデフォ ルトです。
@implementationブロックではgetterとsetterの両方のメソッドが必須です。実装ブロックで @synthesizeディレクティブを使う場合は、getterメソッドとsetterメソッドが合成されます。
readonly
プロパティが読み取り専用であることを示します。
readonlyを指定する場合、@implementationブロックではgetterメソッドだけが必須です。実
装ブロックで@synthesizeディレクティブを使う場合は、getterメソッドだけが合成されます。
また、ドット構文を使って値を代入しようとすると、コンパイラエラーが発生します。
setterのセマンティクス これらの属性は、setアクセサのセマンティクスを指定します。これらは排他的に使われます。
strong
対象オブジェクトに対する強い(所有権を伴う)関係がある旨を指定します。
weak
copy
assign
setterで、単純代入を使用することを指定します。この属性はデフォルトです。
この属性は、NSInteger、CGRectなどのスカラ型に使います。 retain
代入時にオブジェクトに対してretainを呼び出す必要があることを指定します 以前の値にはreleaseメッセージが送信されます。
OS X v10.6以降では、__attribute__キーワードを使用して、メモリ管理においてCore Foundation プロパティをObjective-Cオブジェクトのように扱うように指定できます。
2011-10-12 | © 2011 Apple Inc. All Rights Reserved. 70
対象オブジェクトに対する弱い(所有権を伴わない)関係がある旨を指定します。
対象オブジェクトが割り当て解除されると、プロパティ値は自動的にnilになります
(弱いプロパティは、OS X v10.6やiOS 4では未対応なので、代わりにassignを使ってください)。
代入にオブジェクトのコピーを使用することを指定します
以前の値にはreleaseメッセージが送信されます。
コピーは、copyメソッドを呼び出すことによって作成されます。この属性はオブジェクト型に 対してのみ有効であり、その場合は NSCopyingプロトコルを実装する必要があります。
コピーは、copyメソッドを呼び出すことによって作成されます。この属性はオブジェクト型に 対してのみ有効であり、その場合は NSCopyingプロトコルを実装する必要があります。
宣言済みプロパティ
プロパティの宣言と実装
アトミック性
この属性を使用して、アクセサメソッドがアトミックでないことを指定できます(アトミックである ことを示すキーワードはありません)。
nonatomic
アクセサが非アトミックであることを指定します。デフォルトでは、アクセサはアトミックで す。
プロパティがデフォルトではアトミックであるため、合成されたアクセサがマルチスレッド環境にお いてプロパティへの堅牢なアクセスを可能にしています。つまり、getterから返される値やsetterを通 じて設定される値は、ほかのスレッドが同時に実行しているかどうかに関係なく必ず完全に取得また は設定されます。
strong、copy、retainのいずれかを指定し、nonatomicを指定しない場合、参照カウント環境では、 オブジェクトプロパティ用に合成されたgetterアクセサは、ロックを使用し、戻り値の保持と自動解 放を行います。その実装は、次のようになります。
nonatomicを指定した場合は、オブジェクト用に合成されたアクセサは、単に値を直接返すだけで す。
プロパティの宣言と実装
アトミック性
この属性を使用して、アクセサメソッドがアトミックでないことを指定できます(アトミックである ことを示すキーワードはありません)。
nonatomic
アクセサが非アトミックであることを指定します。デフォルトでは、アクセサはアトミックで す。
プロパティがデフォルトではアトミックであるため、合成されたアクセサがマルチスレッド環境にお いてプロパティへの堅牢なアクセスを可能にしています。つまり、getterから返される値やsetterを通 じて設定される値は、ほかのスレッドが同時に実行しているかどうかに関係なく必ず完全に取得また は設定されます。
strong、copy、retainのいずれかを指定し、nonatomicを指定しない場合、参照カウント環境では、 オブジェクトプロパティ用に合成されたgetterアクセサは、ロックを使用し、戻り値の保持と自動解 放を行います。その実装は、次のようになります。
nonatomicを指定した場合は、オブジェクト用に合成されたアクセサは、単に値を直接返すだけで す。
コメント
コメントを投稿