先日、あるゲームに取り組んでいたとき、_myObject
代わりにself.myObject
.
myObject
それがプロパティであり、コンパイラによって暗黙的に合成され、すでに値を持っていると仮定すると、一番下のものは一番上のものと同じことをしますか?
// Non-ARC
self.myObject = [self someValue];
_myObject = [self someValue];
先日、あるゲームに取り組んでいたとき、_myObject
代わりにself.myObject
.
myObject
それがプロパティであり、コンパイラによって暗黙的に合成され、すでに値を持っていると仮定すると、一番下のものは一番上のものと同じことをしますか?
// Non-ARC
self.myObject = [self someValue];
_myObject = [self someValue];
これらの 2 つの行は根本的に異なります。前者は基本的にプロパティのセッター メソッドへのメソッド呼び出しですが、後者は直接のメンバー割り当てです。
のようなことをするとself.myObject = x
、通常はフォームのメソッド呼び出しと同等になります[self setMyObject:x]
(ただし、プロパティ宣言でオーバーライドされた場合、実際のセッター メソッド名は別のものになる可能性があります)。
retain
orプロパティの場合copy
、そのメソッドでは単純な代入よりも多くのことが行われていることは明らかです。しかし、assign
プロパティの場合でも、大きな違いがあります。
メソッド呼び出しがある場合、メソッドがコードの他の場所でオーバーライドされる可能性が常にあります。直接割り当ての場合、それは常に割り当てであり、他には何もありません。
メソッド呼び出しを使用すると、Key-Value Observingが自動的にサポートされます。直接割り当てでは、KVO 通知は生成されません。
そして最後に、お気付きのように、メンバーの直接割り当てとセッター メソッドの呼び出しの間には明らかに大きなパフォーマンスの違いがあります。