OCベース@propertyキーワードおよび修飾子

2758 ワード

@propertyキーワード


propertyはxcodeコンパイラに属するキーワードには主に3つの役割があります.
  • メンバー変数アクセスを宣言するset/getメソッド
  • set/getメソッド操作
  • を実現する
  • 下線付きインスタンス変数
  • を生成する.
    宣言構文:@property(attr1,attr2,attr3,...)NSString* name;使用可能な修飾キーワードは、機能によって3つに分類されます.
  • assign、retain、copy setメソッドにおける属性参照カウントに関連し、デフォルト値assgin
  • nonatomic、atomic原子アクセスの有無については、デフォルトではatomic
  • readonly、readwriteアクセス制御操作について、デフォルト値readwrite
  • 宣言属性@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に与える影響

  • setメソッドを書き換えると、コンパイラはgetメソッドと下線のメンバー変数
  • のみを生成します.
  • getメソッドを書き換えるとsetメソッドと下線のメンバー変数
  • のみが生成される.
  • set/getメソッドを書き換えると、何もなくなり、下線のメンバー変数も
  • もなくなりました.
    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つの異なるものです.