给定以下属性声明:
@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;