objective-c – ObjC属性和C运算符

objective-c – ObjC属性和C运算符,第1张

概述鉴于以下财产声明: @property NSInteger foo; 增量,减量和复合赋值运算符如何实际对self.foo起作用? 我的理解是self.foo仅仅是实际存取方法的语法糖.所以self.foo不直接访问名为foo的NSInteger变量,而是调用以下任一个: - (void)setFoo:(NSInteger)foo; 要么 - (NSInteger)foo; 然而,下面的一组代码完 鉴于以下财产声明:
@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 0self.foo += 1;NSLog(@"%d",self.foo); // prints 1self.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 0get foo 0set 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;是比较快的.它将被编译为类似于:

mov eax,DWord ptr [bar]inc eax                // difference is here!mov DWord ptr [bar],eax

并且bar = bar 1;至:

mov eax,DWord ptr [bar]add eax,1              // difference is here!mov DWord ptr [bar],eax
总结

以上是内存溢出为你收集整理的objective-c – ObjC属性和C运算符全部内容,希望文章能够帮你解决objective-c – ObjC属性和C运算符所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1239255.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存