这出现在另一个问题中(由meronix友好回答)但我很想知道这里发生了什么,这是一个LLVM / Clang问题,还是两个语句在某种程度上有所不同
我知道我可以通过添加(见下文)来解决这个问题,所以比任何事情更好奇......
答案 0 :(得分:5)
两个语句 不同。只有在左值的类型声明属性时才能使用属性。这是因为属性的getter和setter可能不明显(通常是布尔属性的情况,其中getter显式设置为isSomething
。)如果没有强类型信息,编译器无法推断出。
然而,[lvalue message]
语法没有这种歧义,因此编译器允许它。由于左值的类型为id
,因此可以在没有编译器警告的情况下向其发送任何已知消息。只有两个签名对应同一个选择器时,编译器才会发出警告(例如,一个类具有- (UIWindow *)window
而另一个类具有- (int)window
。)
UIApplicationDelegate
协议定义了window
属性,因此当您明确地将对象键入id <UIApplicationDelegate>
时,编译器会知道该属性并可以使用它。