5

私は C# 開発から来て、Objective-C と Xcode 4 の学習を始めたばかりです。私が理解している限り、値をチェック/制御する必要がない場合、「@synthesize」はプロパティの getter/setter メソッドを置き換えています。読んだり書いたりしています。

しかし、なぜ Xcode 4 は自動的にインスタンス変数を作成するのでしょうか?

これで十分ではないでしょうか:

@synthesize myProperty;

それ以外の:

@synthesize myProperty = _myProperty;

?

ゲッターやセッターがない/必要ないのに、実際のプロパティの代わりにインスタンス変数を使用/したいのはなぜですか?

前もって感謝します!

メンフィズ

編集:

@synthesize がゲッター/セッターを置き換えていることは理解していますが、この部分は何に適しています= _myProperty;か? 「myProperty」を直接使用できるのに、なぜインスタンス変数が必要になるのでしょうか? たとえば、セッターが値の状態をチェックする場合は、「_myProperty」を使用することを理解できます。このチェックをスキップしたい場合は、_myProperty を使用します。しかし、@synthesize を使用しているため、何らかのチェックを行うセッターが配置されていません。では、なぜインスタンス変数を持っている/欲しいのでしょうか?

答え:

MattyG の投稿のコメントを参照してください。

4

2 に答える 2

14

これは、self を使用してセッターとゲッターを介してインスタンス変数にアクセスすることをプログラマーに思い出させるために使用される規則です。したがって、使用している場合:

@synthesize myProperty = _myProperty;

次に、変数に直接アクセスするには、次のように記述する必要があります。

_myProperty = something;

セッターを介して変数にアクセスするには、次のように記述する必要があります。

self.myProperty = something;

利点は、自分自身を介してアクセスすることを忘れた場合です。コンパイラは次のように警告します。

myProperty = something;  //this won't compile

これも参照してください この質問

于 2011-11-07T02:24:33.250 に答える
-2

さて、あなたは.hファイルのプロパティのインスタンス変数とプロパティ自体を宣言します。プロパティへのインターフェースとそれが使用するインスタンス変数はそれで確立されています...その実装は確立されていません。そこで、@ synthesizeキーワードが登場します。これは、プロパティを実装するだけなので、自分で書き出す必要はありません。

C#でプロパティを宣言する方法は次のとおりです

private int _int1;
public int int1 {
  get { return _int1; }
  set { _int1 = value; }
}

これは非常に一般的なコードであり、C#を使用すると、同じものを何度も入力する必要がないように省略できます。

public int int1 { get; set; }

これら2つのコードセグメントの違いは、C#が内部で変数を作成するため、後者にはプライベート変数"_int1"が存在しないことです。@synthesizeキーワードは、ベースとなるインスタンス変数にアクセスできるようにしながら、同じコードを何度も書き留める手間を省くことができるので便利です。

編集。また、ゲッターとセッターはObjective Cに存在することに注意することも重要です。これらは、get{}およびset{}というラベルが付けられているC#とは異なる名前を持っています。Objective Cでは、getterはインスタンス変数と同じ名前のメソッドであり、setterは、単語「set」の後に最初の文字が大文字になっているインスタンス変数名が続くメソッドです。

だから、あなたがあなたの.hファイルにこれを持っているとしましょう

int myVar;
...
@property(nonatomic, assign) int myVar;

.mファイルでゲッターとセッターを自分で実装できます

-(int)myVar {
  return myVar;
}

-(void)setMyVar:(int)newVar {
  myVar = newVar;
}

または、@ synthesizeを使用して、ゲッターとセッターを自動的に書き込むことができます

于 2011-11-07T02:26:41.353 に答える