スキップしてメイン コンテンツに移動

property


プロパティ宣言属性
@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
page69image8176 page69image8336
宣言済みプロパティ
プロパティの宣言と実装
readwrite
プロパティを読み取り/書き込み可能として扱うべきであることを示します。この属性はデフォ ルトです。
@implementationブロックではgettersetterの両方のメソッドが必須です。実装ブロックで @synthesizeディレクティブを使う場合は、getterメソッドとsetterメソッドが合成されます。
readonly
  プロパティが読み取り専用であることを示します。
readonlyを指定する場合、@implementationブロックではgetterメソッドだけが必須です。実 装ブロックで@synthesizeディレクティブを使う場合は、getterメソッドだけが合成されます。 また、ドット構文を使って値を代入しようとすると、コンパイラエラーが発生します。
setterのセマンティクス これらの属性は、setアクセサのセマンティクスを指定します。これらは排他的に使われます。
strong
  対象オブジェクトに対する強い(所有権を伴う)関係がある旨を指定します。
weak
copy
assign
setterで、単純代入を使用することを指定します。この属性はデフォルトです。
この属性は、NSIntegerCGRectなどのスカラ型に使います。 retain
代入時にオブジェクトに対してretainを呼び出す必要があることを指定します 以前の値にはreleaseメッセージが送信されます。
OS X v10.6以降では、__attribute__キーワードを使用して、メモリ管理においてCore Foundation プロパティをObjective-Cオブジェクトのように扱うように指定できます。
2011-10-12 | © 2011 Apple Inc. All Rights Reserved. 70
page70image7192
対象オブジェクトに対する弱い(所有権を伴わない)関係がある旨を指定します。 対象オブジェクトが割り当て解除されると、プロパティ値は自動的にnilになります (弱いプロパティは、OS X v10.6iOS 4では未対応なので、代わりにassignを使ってください)。
代入にオブジェクトのコピーを使用することを指定します 以前の値にはreleaseメッセージが送信されます。
コピーは、copyメソッドを呼び出すことによって作成されます。この属性はオブジェクト型に 対してのみ有効であり、その場合は NSCopyingプロトコルを実装する必要があります。
page70image9240
宣言済みプロパティ
プロパティの宣言と実装
アトミック性
この属性を使用して、アクセサメソッドがアトミックでないことを指定できます(アトミックである ことを示すキーワードはありません)。
nonatomic
アクセサが非アトミックであることを指定します。デフォルトでは、アクセサはアトミックで す。
プロパティがデフォルトではアトミックであるため、合成されたアクセサがマルチスレッド環境にお いてプロパティへの堅牢なアクセスを可能にしています。つまり、getterから返される値やsetterを通 じて設定される値は、ほかのスレッドが同時に実行しているかどうかに関係なく必ず完全に取得また は設定されます。
strongcopyretainのいずれかを指定し、nonatomicを指定しない場合、参照カウント環境では、 オブジェクトプロパティ用に合成されたgetterアクセサは、ロックを使用し、戻り値の保持と自動解 放を行います。その実装は、次のようになります。
nonatomicを指定した場合は、オブジェクト用に合成されたアクセサは、単に値を直接返すだけで す。 

コメント

このブログの人気の投稿

日本に来た 今三週間

四月六日に日本に来た、今三週間になった。 嬉しくなかった、悲しくなかった。 日本の携帯電話のカメラはとてもいいよ、私は今撮影が好きだ、いつも寮に帰る途中で花とか魚とか写真を撮る。これも生活の趣味だ。 滴は綺麗だ 桜が凋んで落ちる 天気がいいとき、自転車に乗って、食材を買った。 自分で料理をつくる、おいしそうでしょう。 昨日清水寺に行った、天気はとても熱いね。日に焼けすぎたので、腕は今赤い。 側に花があるので、赤い清水寺はもっと美しそうだ。 木の色は艶やかだ。