.hファイルのインターフェイス()メソッドだけで変数を合成せずに定義することの違いは何ですか?
-
09-10-2019 - |
質問
このような.hファイルのインターフェイスメソッドで変数を定義します...
@interface ......{
int a;
}
次に、.mファイルで使用します。正常に動作します。
また、コードを変更しました
@interface ......{
int a;
}
@property(nonatomic) int a;
.hファイル、および.mファイルでint値をとして設定します
@synthesize a;
今もうまく機能します...
両方のケースの違いは何ですか?
解決
「A」プロパティを宣言することで、クラスにINTを保存することを許可し、クラス内からアクセスできますが、 それだけ あなたのクラス内。他のオブジェクト(公共財産)がアクセスできるプロパティにしたい場合は、GetterとSetterメソッドが必要です。
それをasとして宣言することによって @property
あなたの中で .h
そして使用します @synthesize
あなたの中で .m
, 、2つの方法を自動的に作成しています。
[myObject a]; // your getter
[myObject setA:50]; // your setter
ここで心に留めておくべきことの1つは、メモリ管理の世話をするため、クラス内であってもシステムを使用することを非常に良い考えであることが多いことです。たとえば、フラグを立てるとき @property
なので retain
:
objectProperty = anObject; // just accessing locally, no memory management
self.objectProperty = anObject; // [anObject retain] will be called
self.objectProperty = nil; // [anObject release] will be called
他のヒント
最初に、フィールドを使用して、直接アクセスできます。 2番目のケースでは、客観的なcプロパティをアクセサーと定義しています。
プロパティを定義および合成する場合、使用して値にアクセスすることもできます int value = self.a; self.a = newValue;
. 。これにより、変数は他のオブジェクトにアクセス可能になります。プロパティがなければ、使用できません self.
変数に到達するために、他のオブジェクトがそれに到達する自動方法はありません。
プロパティを定義して合成すると、IVARとアクセサの両方のメソッド( - (int)a;および - (void)seta:(int)a_;)の両方を生成するようにコンパイラに指示します。これらの方法は、DOT構文を使用して明示的にまたは暗黙的に呼ぶことができます。
self.a = num; // [self setA:num] gets called