0

这出现在另一个问题中(由meronix友好地回答),但我很想了解更多关于这里发生的事情,这是一个 LLVM/Clang 问题,还是这两个陈述在某种程度上不同。

在此处输入图像描述

我知道我可以通过添加(见下文)来解决这个问题,所以比什么都好奇......

在此处输入图像描述

4

1 回答 1

6

两种说法不同。只有当左值的类型声明了属性时,才能使用属性。这是因为属性的 getter 和 setter 可能不明显(通常是布尔属性的情况,其中 getter 显式设置为isSomething。)如果没有强类型信息,编译器无法推断出这一点。

然而[lvalue message],语法没有这种歧义,因此编译器允许它。由于左值的类型是id,任何已知消息都可以发送给它而不会发出编译器警告。编译器只会在两个签名对应于同一个选择器时发出警告(例如,一个类 has- (UIWindow *)window和另一个 has - (int)window。)

UIApplicationDelegate协议定义了一个window属性,因此当您将对象显式键入为id <UIApplicationDelegate>时,编译器会知道该属性并可以使用它。

于 2012-09-25T14:05:16.590 回答