假设我有一个具有标量属性类型的类:
@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
的语法糖的规则的例子。