gpt4 book ai didi

objective-c - 将 C 前/后递增/递减与 Objective-C 点运算符混合工作?

转载 作者:太空狗 更新时间:2023-10-30 03:16:45 25 4
gpt4 key购买 nike

假设我有一个标量属性类型的类:

@property (nonatomic, assign) int myInt;

为了清楚起见,合成如下:

@synthesize myInt = _myInt;

如果有人问我下面这行是否可行:

self.myInt++;

我会说“不”。理由是我们都知道点运算符只是调用编译器生成的 getter 方法的语法糖。所以那一行字面意思是:

[self myInt]++;

如果您将第二行输入到 Xcode 中,它将无法编译,并声明:“不允许分配给‘readonly’ return result of an objective-c message”。这是完全有道理的,这是我所期望的。即使编译了,我也希望结果会增加堆栈上支持 ivar 的副本,而不是 ivar 本身。

但是,指令 self.myInt++ 确实可以编译,并且可以正常工作。它的工作方式就像点运算符直接访问 _myInt 一样。通过提供我自己的 getter 和 setter,我可以看到在这个过程中同时使用了 getter 和 setter,按照这个顺序,就像它实际上是这样的:

[self setMyInt:[self myInt] + 1];

那么,这是点运算符与方法调用完全相同的规则的异常(exception),还是给定的 {--,++, +=, -=} 运算符与点符号一起使用时,Objective-C 编译器会特别注意吗?我一直认为它们是 C 语言的特性,没有针对 Objective-C 的特殊考虑。我看得出来,对于不熟悉 Objective-C 点符号的人来说,这条简单的线会让人非常困惑。

最佳答案

您可以查看汇编器输出,发现它生成了两个 _objc_msgSend 调用。

我猜这更多的是应用规则 a++a = a + 1 的语法糖

关于objective-c - 将 C 前/后递增/递减与 Objective-C 点运算符混合工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7936067/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com