OCインスタンス変数と属性のアクセス制御
2411 ワード
OC開発に入門したばかりの人には、次のような方法でインスタンス変数を作成するのにどのような違いがあるのか疑問があります.PS:簡略化のため、ここではpropertyの修飾語を省略します.
2,3,4行はインスタンス変数、またはメンバー変数を作成します.Cに対して印象的なのはすべて構造体を知っているでしょう、OCの類は本質的に1つの構造体です.7行目はpropertyを宣言し、属性に直訳します.インスタンス変数とは異なります.オブジェクト向けシール特性 オブジェクトのメンバー変数にアクセスする場合は、オブジェクトのメンバー変数を直接参照するのではなく、setterメソッドとgetterメソッドを使用します.
これは簡単なクラスで、このクラスにはプライベートな
しかし、インスタンス変数を追加するたびに対応するsetterとgetterを作成すると、多くのワークロードが追加されることは間違いありません.そのため、アップルのエンジニアは後続のxcodeに文法サポートを追加して入力量を削減します.これがpropertyの役割です.
見えるのは、ここの一行でできます.簡単にpropertyを宣言すると、インスタンス変数を自分で追加したり、setterやgetterを追加したりする時間を節約できます.注意すべきは、propertyを追加すると、
propertyに関連するのはポイント構文です.
点文法は見た目ほど簡単ではなく、展開することができます.
この二つの方法はよく知っているのではないでしょうか.前述したように、setterとgetterであり、ポイント構文はそれらを簡略化しています.インスタンス変数のアクセス制御 上記の例では、
インスタンス変数には、3つの一般的なアクセス修飾語があります.@publicで、この宣言されたインスタンス変数はどこでもアクセスできます. @protected、システムはデフォルトで、指定されていない場合はデフォルトです.外部からアクセスされることはできませんが、布団類からアクセスできます. @private、完全にプライベートで、これは
昔から、プログラマは
今では、クラスの
@interface Person : NSObject {
@public int a;
@protected int b;
@private int c;
}
@property int d;
2,3,4行はインスタンス変数、またはメンバー変数を作成します.Cに対して印象的なのはすべて構造体を知っているでしょう、OCの類は本質的に1つの構造体です.7行目はpropertyを宣言し、属性に直訳します.インスタンス変数とは異なります.
@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つの一般的なアクセス修飾語があります.
@implementation
に宣言されたことと同じです.昔から、プログラマは
@interface
ですべてのインスタンス変数を宣言し、アクセス制御を追加することに慣れていました.その時はいったいどんな理由でこう書いたのでしょうか.私もよくわかりません.遠すぎるからです.今では、クラスの
@interface
に必要なpropertyを宣言し、インタフェースファイルの読み取り性を維持するのが良い習慣です.