【发布时间】:2014-06-18 12:03:35
【问题描述】:
给定以下属性声明:
@property NSInteger foo;
递增、递减和复合赋值运算符实际上是如何在self.foo 上工作的?
据我了解,self.foo 只是实际访问器方法的语法糖。所以self.foo 不是直接访问一个名为foo 的NSInteger 变量,而是调用其中一个:
- (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 变量上使用它们,那么假设递减 pre 和 post fix 运算符以及其他 9 个复合运算符将完全符合您的预期,这可能是安全的。
如果self.foo 真的只是我上面提到的两种方法的语法糖,我只是不明白为什么它会起作用。
如果我覆盖默认访问器以包含 NSLog 语句,以便我可以查看每个语句的调用时间和值,我可以看到先调用 getter,然后调用 setter。
这是否意味着:
self.foo += 1;
实际上被替换为:
[self setFoo:([self foo] + 1)];
在预编译期间?
编辑:那么,在汇编级别,self.foo += 1; 和 self.foo = self.foo + 1; 之间有什么区别吗?如果我们不是在谈论属性,而bar 只是一个常规的 int,那么在汇编级别,bar += 1; 和 bar = bar + 1; 之间是否有区别?
【问题讨论】:
-
没错。你的假设是正确的。
-
鉴于结果,很明显您的假设是正确的。
-
我在我的问题中添加了一个附录,试图澄清我的实际意思。
-
@nhgrif 我已将您的问题的答案添加到我的帖子中。请检查。
标签: objective-c properties operators increment compound-assignment