【发布时间】:2011-12-17 16:12:30
【问题描述】:
假设我有一个具有标量属性类型的类:
@property (nonatomic, assign) int myInt;
为了清楚起见,合成如下:
@synthesize myInt = _myInt;
如果有人问我以下行是否可行:
self.myInt++;
我会说“不”。理由是我们都知道点运算符只是调用编译器生成的 getter 方法的语法糖。所以那行字面意思是:
[self myInt]++;
如果您在 Xcode 中键入第二行,它将无法编译,并说明:“不允许分配给 'readonly' 的 Objective-c 消息的返回结果”。这是完全有道理的,这正是我所期望的。即使编译完成,我也会期望结果会增加堆栈上支持 ivar 的副本,而不是 ivar 本身。
但是,self.myInt++ 指令确实可以编译,并且可以正常工作。它就像那个点运算符直接访问 _myInt 一样工作。通过提供我自己的 getter 和 setter,我可以看到 getter 和 setter 都按顺序在流程中使用,就像实际上一样:
[self setMyInt:[self myInt] + 1];
那么,这是点运算符与方法调用完全相同的规则的一个例外,还是 {--, ++, +=, -=} 运算符在与点符号一起使用时被 Objective-C 编译器特别注意?我一直认为它们是一种 C 语言特性,对 Objective-C 没有特殊考虑。我可以看到,对于不熟悉 Objective-C 点符号的人来说,这条简单的线非常令人困惑。
【问题讨论】:
标签: objective-c syntax