【问题标题】:Mixing C pre/post increment/decrement with Objective-C dot operator works?将 C 前/后递增/递减与 Objective-C 点运算符混合是否有效?
【发布时间】: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


    【解决方案1】:

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

    我想这更像是应用a++a = a + 1 的语法糖的规则的情况

    【讨论】:

    • 前缀运算符 (++self.myInt) 是否也适用?
    • 查看反汇编输出,我看到两个objc_msgSend,所以是的。您正在增加属性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-03
    • 2011-07-21
    • 2010-10-12
    • 2011-03-17
    • 2011-08-29
    • 1970-01-01
    相关资源
    最近更新 更多