@propertyと@synthesize

2495 ワード

前言


@propertyと@synthesizeはXcode 4.4以前はずっと協力して使用していましたが、4.4以降、@propertyが強化され、1行のコードコンパイラがsetterとgetterメソッドの宣言と実現を自動的に生成してくれます.mファイルに属性名と同じ下線を持つメンバー変数(private)を宣言します.

例を挙げる

  • はXcode 4にある.4より前の
  • Person.h
    
    @property (nonatomic, assign) NSInteger age;
    
    //   , name setter and getter 
    - (void)setAge:(NSInteger)age;
    - (NSInteger)age;
    
    Person.m
    @synthesize age;
    
    //   , Person.m  _name  , setter and getter 
    
    
  • はXcode 4にある.4以降
  • @propertyが強化され、1行のコードでsetter and getterメソッドの宣言と実装、およびメンバー変数の宣言
  • が完了します.
    @property (nonatomic, assign) NSInteger age;
    
    
  • 注意
  • setter and getter方式を同時に書き換えると、システムがエラーを報告します.なぜなら、見つからないからです.ageこの変数[画像のアップロードに失敗しました...(image-13 c 4 ab-1254421738)]
  • 解決策
  • 第一案:在.hのファイルにこの属性を宣言する
  •   Person.h
      @interface Person : NSObject {
          NSInteger _age;
      }
      @property NSInteger age;
      @end;
    
    
  • 第二案:在.mのファイルで@synthesize
  • を使用
      @implementation Person
      @synthesize age = _age;
      - (void)setAge:(NSInteger)age {
           _age = age;
      }
      - (NSInteger)age {
           return _age;
      }
    
    
  • 初心者は以下のコードが特におかしいと思うかもしれません
  • @synthesize age = _age;
    
    
  • 実際には、コンパイラageのプロパティを_ageインスタンス変数生成setter and getterメソッドの実装
  • すなわちage属性のsetterメソッドはsetAgeであり、それは_ageという変数.
  • この値を付与するように見える操作により、@synthesizeで変数名とは異なるsetterとgetterの名前を定義し、変数が不適切にアクセスされないように保護することができます.
  • AppleのSample Codeを見ると、この書き方はよく見られる
  • です.
  • 上記の原理がわかったら、私たちも知っています.ageとageの違い.
  • _ageはメンバー変数
  • ageは属性
  • である.
  • 最後に操作したのはメンバー変数
  • です

    最後に


    @propertyの修飾子をまとめます
  • readwrite:デフォルト属性で、setterメソッドとgetterメソッドの宣言と実装
  • が自動的に生成されます.
  • readonly:getterを生成するだけでsetter
  • は生成されません.
  • atomic:原子属性、生成されたsetterおよびgetter法は原子操作である.複数のスレッドが同時にsetterを呼び出す場合、あるスレッドがsetterのすべての文を実行する前に、別のスレッドがsetterを実行し始めることは、メソッドのヘッダにロックがかかっているのと同じです.セキュリティは高いが、プログラム特別のカード(開発では一般的にこの属性を使用しない)
  • を招く.
  • nonatomic:非原子属性で、マルチスレッドの場合はデータに問題があるかもしれませんが、パフォーマンスが向上します.(開発でよく使われる)
  • assign:この属性は一般的にint,char,floatなどの基本データ型を処理し、assignはデフォルトであり、この属性を追加しなくてもよい.参照数は変更されません.
  • retain:古いオブジェクトにreleaseを割り当て、入力オブジェクトretainを古いオブジェクト
  • に割り当てます.
  • copy:これは、メモリにオブジェクトのコピーを新たに生成することに相当します.これにより、宣言したメンバー変数を変更することはできません.オブジェクトのコピー(デプスコピー)を使用するべきことを指定し、前の値からreleaseメッセージを送信します.基本的にretainのようですが、参照カウントは増加せず、新しいメモリを割り当てて配置します.copyは新しいオブジェクトを作成し、retainはポインタを作成し、参照オブジェクトのカウントに1を加算します.