OCインスタンス変数と属性のアクセス制御

2411 ワード

OC開発に入門したばかりの人には、次のような方法でインスタンス変数を作成するのにどのような違いがあるのか疑問があります.PS:簡略化のため、ここではpropertyの修飾語を省略します.
@interface Person : NSObject {
    @public int a;
    @protected int b;
    @private int c;
}

@property int d;


2,3,4行はインスタンス変数、またはメンバー変数を作成します.Cに対して印象的なのはすべて構造体を知っているでしょう、OCの類は本質的に1つの構造体です.7行目はpropertyを宣言し、属性に直訳します.インスタンス変数とは異なります.
  • オブジェクト向けシール特性
  • オブジェクトのメンバー変数にアクセスする場合は、オブジェクトのメンバー変数を直接参照するのではなく、setterメソッドとgetterメソッドを使用します.
    @interface SomeClass : NSObject
    - (void)setName:(NSString *)name;
    - (NSString *)name;
    @end
    
    @implementation SomeClass {
        NSString *_privateName;
    }
    
    - (void)setName:(NSString *)name {
        self->_privateName = name;
    }
    
    - (NSString *)name {
        return self->_privateName;
    }
    
    @end
    

    これは簡単なクラスで、このクラスにはプライベートな_privateNameインスタンス変数が@implementationに書かれています.このインスタンス変数は内部でしか使用できません.外部では参照できません.このインスタンス変数に外部がアクセスできるように、@interfaceにはgetterメソッドとsetterメソッドがそれぞれ書かれており、外部はこの2つのメソッドでオブジェクトのインスタンス変数にアクセスします.これは基本的なオブジェクト向けの設計方式です.
    しかし、インスタンス変数を追加するたびに対応するsetterとgetterを作成すると、多くのワークロードが追加されることは間違いありません.そのため、アップルのエンジニアは後続のxcodeに文法サポートを追加して入力量を削減します.これがpropertyの役割です.
    @interface SomeClass : NSObject
    @property NSString *name;
    @end
    
    @implementation SomeClass
    @end
    
    

    見えるのは、ここの一行でできます.簡単にpropertyを宣言すると、インスタンス変数を自分で追加したり、setterやgetterを追加したりする時間を節約できます.注意すべきは、propertyを追加すると、_nameのようなpropertyの名前に下線を付けるインスタンス変数が自動的に生成されます.
    propertyに関連するのはポイント構文です.
      SomeClass *a = [SomeClass new];
      a.name = @"just a";
      NSString *name = a.name;
    
    

    点文法は見た目ほど簡単ではなく、展開することができます.
      [a setName:@"just a"];
      NSString *name = [a name];
    

    この二つの方法はよく知っているのではないでしょうか.前述したように、setterとgetterであり、ポイント構文はそれらを簡略化しています.
  • インスタンス変数のアクセス制御
  • 上記の例では、@implementationで宣言されたインスタンス変数は内部アクセスのみであり、プライベートであると述べています.また、この声明は布団類から引用することはできません.
    インスタンス変数には、3つの一般的なアクセス修飾語があります.
  • @publicで、この宣言されたインスタンス変数はどこでもアクセスできます.
  • @protected、システムはデフォルトで、指定されていない場合はデフォルトです.外部からアクセスされることはできませんが、布団類からアクセスできます.
  • @private、完全にプライベートで、これは@implementationに宣言されたことと同じです.

  • 昔から、プログラマは@interfaceですべてのインスタンス変数を宣言し、アクセス制御を追加することに慣れていました.その時はいったいどんな理由でこう書いたのでしょうか.私もよくわかりません.遠すぎるからです.
    今では、クラスの@interfaceに必要なpropertyを宣言し、インタフェースファイルの読み取り性を維持するのが良い習慣です.