OCベース@propertyキーワードおよび修飾子
2758 ワード
@propertyキーワード
propertyはxcodeコンパイラに属するキーワードには主に3つの役割があります.
宣言構文:
@property(attr1,attr2,attr3,...)NSString* name;
使用可能な修飾キーワードは、機能によって3つに分類されます.@property NSString* name;
は@property(assgin,atomic,readwrite)NSString * name;
に等しいさらにARCにはweak、strong属性が追加され、weak機能はassginに似ており、修飾された属性が解放されると、ocで空のオブジェクトにメッセージを送信できるため、weakは自動的にnilに値を設定します.assignは、メッセージを送信するとcrashに直接つながる野ポインタを直接作成しません.strongはretainと似ており、多くのシーンで基本的に通用します.
属性修飾子
assign
は、NSInteger、doubleなどのCタイプのデータ型を修飾したり、OCオブジェクトタイプを修飾したりするのに直接的に簡単な付与値ですが、変数の参照カウントには役に立たず、指すオブジェクトが解放されると野ポインタになります.そのset方法は以下の通りである:-(void)setName:(NSString *)name
{
_name = name;
}
retain
はよく使われるNSArray,NSDictionaryなどのOCオブジェクトを修飾し,新しい値の参照カウントに1を加え,付与時に古い値を先に解放し,retainの新しい値にそのsetを付与する方法は以下の通りである:-(void)setName:(NSString *)name
{
if (_name != name) {
[_name release];
}
_name = [name retain];
}
copy
元のオブジェクトの参照数に影響を与えない新しいオブジェクトをコピーします.copy修飾を使用する属性は、NSCopyingプロトコルのsetメソッドに従う必要があります.-(void)setName:(NSString *)name
{
if (_name != name) {
[_name release];
}
_name = [name copy];
}
readonly/readwrite
デフォルトreadwrite生成set、getメソッド、readonly:getメソッドのみ生成nonatomic/atomic
デフォルトatomic原子アクセス、オブジェクトへのアクセス時にスレッドがロック処理されるため、パフォーマンス上のオーバーヘッドが発生します.nonatomic非原子操作、マルチスレッドアクセス読み書き操作に異常が発生すると推定されます.set/getメソッドの書き換え、メソッド名の変更がpropertyに与える影響
propertyでset/getメソッド名を変更し、eg
@property(getter=getMyName,setter=setMyName:)NSString * name;
このとき生成されるsetメソッドとgetメソッドは次のようになります.
-(void)setMyName:(NSString *)name
-(NSString *)getMyName
@synthesizeキーワード
xcode 4.5以前は
property
とともに使用され、set/getメソッドの実装を生成し、下線付きメンバー変数を追加しました.@implementation:
@synthesize name = _name;
で属性nameのset、getメソッドを生成して操作_nameインスタンス変数.xcode 4.5以降は
property
が機能しているため、ほとんど使われなくなっている.属性!=変数#ヘンスウ#
以上から分かるように、
@property(assgin,atomic,readwrite)NSString * name;
name
は、ここでは属性、または属性変数であり、1つの属性には変数のほかにsetまたはgetアクセスメソッドがあり、生成された_name
こそ真のメンバー変数である.したがって、属性変数とメンバー変数は完全に2つの異なるものです.