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

@property (nonatomic, assign) int myInt;

为了清楚起见,合成如下:
@synthesize myInt = _myInt;

如果有人问我下面这句话是否行得通:
self.myInt++;

我会说“不”。其基本原理是我们都知道点运算符只是调用编译器生成的getter方法的语法糖。所以这条线是字面上的:
[self myInt]++;

如果将第二行键入XCODEL,它将无法编译,说明:“不允许ObjuleC消息的只读”返回结果。这完全有道理,这也是我所期望的。即使编译了它,我也希望结果在堆栈上增加一个支持ivar的副本,而不是ivar本身。
但是,指令self.myInt++确实是编译的,而且是有效的。它的工作方式就好像那个点运算符直接访问myint一样。通过提供我自己的吸气剂和设定器,我可以看到吸气剂和定位器都在这个过程中使用,按顺序,实际上是:
[self setMyInt:[self myInt] + 1];

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

最佳答案

您可以查看汇编器输出并看到它生成两个_objc_msgSend调用。
我想这更像是一个应用a++a = a + 1的语法糖的规则的例子。

10-06 02:39