给定以下属性声明:
@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
而且我认为可以安全地假设递减 pre 和 post fix 运算符以及其他 9 个复合运算符将完全按照您在NSInteger
变量上使用它们时的预期效果。
我只是不明白为什么它self.foo
真的只是我上面提到的两种方法的语法糖。
如果我覆盖默认访问器以包含NSLog
语句,以便我可以看到每个访问器何时被调用以及使用什么值,我可以看到首先调用 getter,然后调用 setter。
这是否意味着以下内容:
self.foo += 1;
被有效地替换为:
[self setFoo:([self foo] + 1)];
在预编译期间?
编辑:self.foo += 1;
那么,在装配层面,和之间有什么区别self.foo = self.foo + 1;
吗?如果我们不是在谈论一个属性,而只是一个普通的 int,那么在汇编级别,和bar
之间有区别吗?bar += 1;
bar = bar + 1;