2012-09-25 36 views
0

這出現在另一個問題(友好地回答meronix),但我很想了解更多關於這裏發生的事情,這是LLVM/Clang問題,還是兩個聲明在某些方面有所不同。在對象上找不到屬性「窗口」?

enter image description here

我知道我可以通過增加(見下文)解決這個問題,所以比什麼都好奇......

enter image description here

回答

5

這兩個語句不同。一個屬性只能在左值的類型聲明該屬性時使用。這是因爲屬性的getter和setter可能不明顯(通常是布爾屬性,其中getter明確設置爲isSomething。)編譯器無法推斷出沒有強類型信息。

然而,[lvalue message]語法沒有這樣的歧義,因此編譯器允許它。由於左值的類型爲id,因此可以在沒有編譯器警告的情況下將任何已知消息發送給它。如果兩個簽名對應相同的選擇,編譯器將只警告(例如,一個類有- (UIWindow *)window和另一個具有- (int)window。)

UIApplicationDelegate協議定義了window財產,所以當你明確地鍵入對象id <UIApplicationDelegate>時,編譯器知道該屬性並可以使用它。

+0

謝謝喬納森爲一個完美的答案,非常感謝。 – fuzzygoat

相關問題