2015-03-13 101 views
0

我有一個問題similar to this one,但我很想知道是否有任何方法(編譯器標誌,@ -directive等)讓類在編譯時考慮@dynamic的所有可能的屬性,以便您可以編碼針對任意任意屬性,而不必將其明確聲明爲@dynamic。是否有可能在Objective-C中創建@dynamic所有可能的屬性?

例如我可能只是這樣做:

myObject.anyPropertyName = someObject; 

...就像你可以在JavaScript中做,而不必申報@dynamic anyPropertyName

+1

我不明白你問的問題與你關聯的問題不同。你能澄清嗎? – 2015-03-13 18:54:15

+0

具體而言,我希望我能夠使用任何有效的標識符作爲點符號屬性訪問權限,而不必先在類上動態調用它,然後將該調用變爲重寫的setValue:forKey方法。類。 – devios1 2015-03-13 21:21:57

+1

iOS開發學習中的「一切應該是動態的,並且在運行時始終」。 :)看起來很誘人,但是你會失去編譯器檢查類型和邏輯的能力。在實踐中,儘可能地依靠編譯器來審查代碼,同時在應用程序中編寫任何類型的目標構建動態作爲算法 - 可以通過代碼進行驗證。 – bbum 2015-03-15 17:20:06

回答

4

你想要什麼是不可能的。編譯器不會讓你發送任何消息而沒有在之前聲明該選擇器。這當然包括訪問屬性。這是必要的,因此編譯器可以知道需要什麼類型 - 並非所有東西都是對象。編譯器必須爲對象(想到ARC),結構或標量生成不同的代碼。

另一方面,運行時會很樂意在不聲明這些屬性的情況下處理這個問題。但那麼你的工作就是把正確的變種objc_msgSend轉換成正確的簽名。這當然需要比直接使用valueForKey:setValue:forKey:更加醜陋的代碼。

另外@dynamic實際上並沒有什麼關係。所有@dynamic都會關閉編譯器關於getter和setter的缺失實現,並阻止它自動生成它們。這是向編譯器保證在運行時會處理這些消息的一種方式。使用@dynamic不會自動將屬性訪問轉發給valueForKey:和setValue:forKey :.

+0

我沒想到這是可能的,但我一直在尋找更動態的方法。 ;)我意識到它不會轉發,但它確實允許您使用標識符作爲屬性訪問器,而不必在編譯時實際定義屬性訪問器本身,所以我認爲這可能是一小步,想知道是否有方法將其作爲課程的默認設置。不管怎樣,謝謝。 – devios1 2015-03-13 22:31:39

相關問題