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