大佬教程收集整理的这篇文章主要介绍了objective-c – ObjC属性和C运算符,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
@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
而且我认为假设前后修复运算符以及其他9个复合运算符的递减将完全符合您在NSInteger变量上直接使用它们时所期望的那样,这可能是安全的.
我只是不明白为什么它的工作原理如果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;?
在@interface部分:
@property(nonatomiC) NSInteger foo; // nonatomic keyword is not really required but // it is better to add it since we will implement // property as nonatomic
在@implementation部分:
- (void)setFoo:(NSInteger)foo { _foo = foo; // _foo variable is implicitly generated by compiler NSLog(@"set foo %d",_foo); } - (NSInteger)foo { NSLog(@"get foo %d",_foo); return _foo; }
然后跑
self.foo = 0; self.foo += 1;
你应该在调试窗口中收到:
set foo 0 get foo 0 set foo 1
更新:
> Re:“在汇编级别,self.foo = 1;和self.foo = self.foo 1;?之间有什么区别吗?”
不.对于两者[self setFoo:([self foo] 1)];将被召唤.
> Re:如果我们不讨论属性怎么办,而bar只是一个常规int,在汇编级别是bar = 1之间的区别;和bar = bar 1;?
是.但只有关闭编译时优化.
bar = 1;是比较快的.它将被编译为类似于:
@H_122_2@mov eax,dword ptr [bar] inc eax // difference is here! mov dword ptr [bar],eax并且bar = bar 1;至:
@H_122_2@mov eax,dword ptr [bar] add eax,1 // difference is here! mov dword ptr [bar],eax以上是大佬教程为你收集整理的objective-c – ObjC属性和C运算符全部内容,希望文章能够帮你解决objective-c – ObjC属性和C运算符所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。