0

インスタンス変数とプロパティを知っています。UILabelこのように初期化する人をよく見かけます

self.label = [[UILabel alloc] init]; //and 
_label = [[UILabel alloc] init];

self.labelでは、オブジェクトを使用することと_label設定することの違いは何ですか?

4

4 に答える 4

2

違いは単純です: Usingself.label = [[UILabel alloc] init]は実際にメソッドを呼び出し、[self setLabel:[[UILabel alloc] init]]using_label = [[UILabel alloc] init]は値をインスタンス変数に直接代入します。

実際には、これが意味することは、呼び出されたメソッドがおそらく次のような多くのものを処理するため、通常はドット構文を使用するのが最善であることです。

  • メモリ管理:たとえば、属性 'strong' または 'retain' でプロパティを宣言した場合、呼び出されたメソッドは割り当てられたオブジェクトを保持する必要があります。
  • Key-Value コーディング通知:クラスがプロパティの Key-Value コーディングに準拠している可能性があります。これは、呼び出されたメソッドがオブザーバー オブジェクトへの変更を通知することを意味します。

ドット構文を使用しないのはなぜですか? 次の 2 つの理由が考えられます。

  • 副作用を避けるには:イニシャライザ メソッド内でドット構文を使用しないことをお勧めします。これは、値を割り当てたいが、安全上の理由から、呼び出されたメソッドの他の副作用を望まないためです。
  • パフォーマンス:これはおそらくまれですが、パフォーマンスの高いメソッドを実装しようとしていて、インスタンス変数を直接使用すると、メソッドを呼び出すコストを節約できる場合があります。

詳細を知りたい場合は、ここで言及したアイデアをより詳細に説明しているこのiOS ガイドを読むことをお勧めします。

于 2014-02-18T06:55:14.663 に答える
1

違いは次のとおりです。

の付いた名前_variableはインスタンス変数です。

self.variableオブジェクトで getter メソッドを呼び出しています。

あなたの例では、インスタンス変数は自動的に生成され、プロパティを合成する必要もありません。

ARCを使用していない場合、例の実際の重要な違いが現れます-

self.variableプロパティをretainまたはstrongでマークすると、オブジェクトが保持されますが、_variableメモリ管理にはまったく対処しません

于 2014-02-18T04:54:04.663 に答える
0

違いは、_label を使用するとインスタンス変数 (略して ivar) に直接アクセスすることですが、self.label を使用すると実際には[self setLabel:[[UILabel alloc] init]];.

メソッドを呼び出すと、setLabel:(プロパティの宣言方法に応じて) 変数を保持する可能性があるなど、他の処理が実行されますが、メソッドで設定された他の副作用もトリガーされる可能性がありますsetLabel:。これらの副作用は、データ検証のようなものである可能性があり、おそらくその値をサーバーに同期する可能性があります.

于 2014-02-18T04:55:40.497 に答える
0

あなたの例では、自分自身self.labelでゲッターメソッド「ラベル」を呼び出します-これは、を呼び出すことと同じ[self label]です。_labelクラス インスタンス プロパティのバッキング ストアです。つまり、インスタンス変数であり、標準変数に直接アクセスするのと同じです。それにラップされた getter メソッドはありません。

プロパティの getter/setter メソッドをオーバーライドできるため、この違いは非常に重要です。たとえば、変数の状態の変化に何らかの動作の変化をバンドルしたい場合などに、これを行うことができます。getter または setter を呼び出すと、この動作が維持されます。getter を呼び出すと、変数も保持されます。

基本的に、特定のインスタンスでクラス化することを好む理由がわからない場合は_label、 getter を使用してself.labelください。使用したいケースの 1 つ_labelは初期化中です。この場合、getter がもたらす可能性のある動作なしで満足のいくデフォルトを設定する必要があります。

于 2014-02-18T04:54:13.517 に答える