2010年11月13日土曜日

プロパティ

目的*1
■ プロパティ宣言により、アクセサメソッドの動作方法の明瞭で明示的な仕様を指定できます。
■ コンパイラは、宣言で指定された仕様に従ってアクセサメソッドを合成できます。これは、コードの記述と保守が少量で済むことを意味します。
■ プロパティは構文上は識別子として表現され、範囲付きであるため、コンパイラは宣言されていないプロパティの使用を検出できます。
■ あるクラスによって宣言されたプロパティの実行時のイントロスペクション。
-----------------------------------

イントロスペクション(リフレクション)*2
通常、プログラムのソースコードがコンパイルされると、プログラムの構造などの情報は低レベルコード(アセンブリ言語など)に変換される過程で失われてしまう。リフレクションをサポートする場合、そのような情報は生成されるコードの中にメタデータとして保存される。

宣言属性
iPhone 開発で主に使用される属性をまとめた。
プロパティ属性 説明
assign setterで単純代入を使用することを指定する
retain 代入時にオブジェクトに対してretain を呼び出す必要があることを指定する
copy 代入にオブジェクトのコピーを使用することを指定する
nonatomic 合成されるアクセサが非アトミックになるように指定する

retain*3
クライアントオブジェクト側において、プログラム上の有効範囲を超えた後も受け取ったオブジェクトを保持する必要がある場合は、受け取ったオブジェクトを保持できます。それには、retainメッセージを送信します。

nonatomic*4
nonatomic属性の影響は環境によって異なります。デフォルトでは、合成されるアクセサはすべてアトミックです。マネージドメモリ環境では、アトミックな動作を保証するにはロックを使用する必要があります。また、返されるオブジェクトは保持され自動解放されます。このようなアクセサが頻繁に呼び出されると、アトミックな動作はパフォーマンスに重大な影響をもたらすことがあります。ガベージコレクトされる環境では、ほとんどの合成メソッドはこうしたオーバーヘッドなし
でアトミックになります。
アトミックな実装の目的は堅牢なアクセサを提供することであり、コードの正確性を保証することではないことを理解することが重要です。「アトミック」とは、プロパティへのアクセスがスレッドセーフであるという意味ですが、単にクラス内のすべてのプロパティをアトミックにするだけでそのクラス(一般にはオブジェクトグラフ)が「スレッドセーフ」になるということではありません。スレッドの安全性を個々のアクセサメソッドのレベルで表現することはできません。

参照

*1
Objective-C 2.0 プログラミング言語

*2
イントロスペクション(リフレクション)

*3
Cocoa Fundamentals Guide / cocoaオブジェクトのライフサイクル

*4
objective-c 2.0 プログラミング言語 / パフォーマンスとスレッド