2

このように.hファイルのインターフェースメソッドで変数を定義します...

@interface ......{
  int a;
}

次に、.mファイルで使用しますが、正常に動作します....

また、コードを次のように変更しました

@interface ......{
  int a;
}
@property(nonatomic) int a;

.h ファイルと .m ファイルでは、int 値を次のように設定します。

@synthesize a;

現在も正常に動作しています...

両方のケースの違いは何ですか?

4

4 に答える 4

2

最初のケースでは、フィールドに直接アクセスしてフィールドを使用します。2 番目のケースでは、アクセサーを使用して Objective C のプロパティを定義しています。

于 2011-01-10T11:46:05.600 に答える
1

「a」プロパティを宣言することにより、int をクラスに格納できるようになり、クラス内からアクセスできますが、クラス内でのみアクセスできます。他のオブジェクトからアクセスできるプロパティ (パブリック プロパティ) にしたい場合は、getter メソッドと setter メソッドが必要です。

で として宣言し、 で使用することにより@property.h@synthesize.m2 つのメソッドが自動的に作成されます。

[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
于 2011-01-10T05:10:19.293 に答える
0

プロパティを定義して合成すると、 を使用して値にアクセスすることもできますint value = self.a; self.a = newValue;。これにより、変数は他のオブジェクトからもアクセス可能になります。プロパティがないと、 を使用して変数にアクセスできず、self.他のオブジェクトが自動的に変数にアクセスする方法はありません。

于 2011-01-10T05:02:40.330 に答える
0

プロパティを定義して合成するときは、ivar メソッドとアクセサ メソッド (-(int)a; および -(void)setA:(int)a_;) の両方を生成するようにコンパイラに指示します。これらのメソッドは、ドット構文を使用して明示的または暗黙的に呼び出すことができます。

self.a = num; // [self setA:num] gets called 
于 2011-01-10T05:03:01.923 に答える