次のプロパティ宣言があるとします。
@property NSInteger foo;
インクリメント、デクリメント、および複合代入演算子は実際にどのように機能しself.foo
ますか?
self.foo
実際のアクセサー メソッドの構文糖衣に過ぎないというのが私の理解でした。したがって、 という変数self.foo
に直接アクセスするのではなく、次のいずれかを呼び出します。NSInteger
foo
- (void)setFoo:(NSInteger)foo;
また
- (NSInteger)foo;
それでも、次のコード セットはまったく問題なく、フラグも立てられず、問題なくコンパイルされ、期待どおりの結果が返されます。
self.foo = 0;
NSLog(@"%d",self.foo); // prints 0
self.foo += 1;
NSLog(@"%d",self.foo); // prints 1
self.foo++;
NSLog(@"%d",self.foo); // prints 2
++self.foo;
NSLog(@"%d",self.foo); // prints 3
NSInteger
そして、デクリメントのプレフィックス演算子とポストフィックス演算子、およびその他の 9 つの複合演算子は、変数に対して直接使用した場合に期待どおりの動作をすると想定するのがおそらく安全だと思います。
self.foo
上記の2つの方法の構文糖衣が本当に機能する理由がわかりません。
デフォルトのアクセサーを上書きしてNSLog
ステートメントを含めると、それぞれがいつ呼び出され、どの値で呼び出されるかがわかります。ゲッターが最初に呼び出され、次にセッターが呼び出されることがわかります。
これは、次のことを意味しますか。
self.foo += 1;
効果的にこれに置き換えられます:
[self setFoo:([self foo] + 1)];
プリコンパイル中?
編集:では、アセンブリ レベルでは、 と の間に違いはself.foo += 1;
ありself.foo = self.foo + 1;
ますか? プロパティについて話しているのでbar
はなく、単なる通常の int である場合、アセンブリ レベルで と の間に違いはbar += 1;
ありbar = bar + 1;
ますか?