インスタンス変数とプロパティを知っています。UILabel
このように初期化する人をよく見かけます
self.label = [[UILabel alloc] init]; //and
_label = [[UILabel alloc] init];
self.label
では、オブジェクトを使用することと_label
設定することの違いは何ですか?
インスタンス変数とプロパティを知っています。UILabel
このように初期化する人をよく見かけます
self.label = [[UILabel alloc] init]; //and
_label = [[UILabel alloc] init];
self.label
では、オブジェクトを使用することと_label
設定することの違いは何ですか?
違いは単純です: Usingself.label = [[UILabel alloc] init]
は実際にメソッドを呼び出し、[self setLabel:[[UILabel alloc] init]]
using_label = [[UILabel alloc] init]
は値をインスタンス変数に直接代入します。
実際には、これが意味することは、呼び出されたメソッドがおそらく次のような多くのものを処理するため、通常はドット構文を使用するのが最善であることです。
ドット構文を使用しないのはなぜですか? 次の 2 つの理由が考えられます。
詳細を知りたい場合は、ここで言及したアイデアをより詳細に説明しているこのiOS ガイドを読むことをお勧めします。
違いは次のとおりです。
の付いた名前_variable
はインスタンス変数です。
self.variable
オブジェクトで getter メソッドを呼び出しています。
あなたの例では、インスタンス変数は自動的に生成され、プロパティを合成する必要もありません。
ARCを使用していない場合、例の実際の重要な違いが現れます-
self.variable
プロパティをretainまたはstrongでマークすると、オブジェクトが保持されますが、_variable
メモリ管理にはまったく対処しません
違いは、_label を使用するとインスタンス変数 (略して ivar) に直接アクセスすることですが、self.label を使用すると実際には[self setLabel:[[UILabel alloc] init]];
.
メソッドを呼び出すと、setLabel:
(プロパティの宣言方法に応じて) 変数を保持する可能性があるなど、他の処理が実行されますが、メソッドで設定された他の副作用もトリガーされる可能性がありますsetLabel:
。これらの副作用は、データ検証のようなものである可能性があり、おそらくその値をサーバーに同期する可能性があります.
あなたの例では、自分自身self.label
でゲッターメソッド「ラベル」を呼び出します-これは、を呼び出すことと同じ[self label]
です。_label
クラス インスタンス プロパティのバッキング ストアです。つまり、インスタンス変数であり、標準変数に直接アクセスするのと同じです。それにラップされた getter メソッドはありません。
プロパティの getter/setter メソッドをオーバーライドできるため、この違いは非常に重要です。たとえば、変数の状態の変化に何らかの動作の変化をバンドルしたい場合などに、これを行うことができます。getter または setter を呼び出すと、この動作が維持されます。getter を呼び出すと、変数も保持されます。
基本的に、特定のインスタンスでクラス化することを好む理由がわからない場合は_label
、 getter を使用してself.label
ください。使用したいケースの 1 つ_label
は初期化中です。この場合、getter がもたらす可能性のある動作なしで満足のいくデフォルトを設定する必要があります。