使用Objective-C点运算符混合C前/后递增/递减有效吗?

Mat*_*ing 16 syntax objective-c

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

@property (nonatomic, assign) int myInt;
Run Code Online (Sandbox Code Playgroud)

为清楚起见,合成如下:

@synthesize myInt = _myInt;
Run Code Online (Sandbox Code Playgroud)

如果有人问我以下行是否有效:

self.myInt++;
Run Code Online (Sandbox Code Playgroud)

我会说"不".理由是我们都知道点运算符只是用于调用编译器生成的getter方法的语法糖.这条线就是字面意思:

[self myInt]++;
Run Code Online (Sandbox Code Playgroud)

如果你在Xcode中键入第二行,它将无法编译,说明:"分配给'readonly'不允许使用objective-c消息的返回结果".这是完全合理的,这是我所期望的.即使编译完成,我也希望结果能够增加堆栈上支持ivar的副本,而不是ivar本身.

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

[self setMyInt:[self myInt] + 1];
Run Code Online (Sandbox Code Playgroud)

那么,点运算符与方法调用完全相同的规则是一个例外,或者{--, ++, +=, -=}与点符号一起使用时,Objective-C编译器是否特别关注运算符?我一直认为它们是C语言的特性而没有特别考虑Objective-C.我可以看到这条简单的线条对于不熟悉Objective-C点符号的人来说非常混乱.

Dav*_*ham 12

您可以查看汇编程序输出,看看它是否会生成两个_objc_msgSend调用.

我猜这更像是应用了a++句法糖的规则a = a + 1