Objective-C屬性在運行時解決了什麼問題?調用[obj valueForKey:@「property」]總會產生相同的結果嗎?Objective-C屬性在運行時解決了什麼問題?
例如
obj.property
Objective-C屬性在運行時解決了什麼問題?調用[obj valueForKey:@「property」]總會產生相同的結果嗎?Objective-C屬性在運行時解決了什麼問題?
例如
obj.property
首先,請注意obj.property
與[obj property]
完全相同。點語法只是語法糖。雖然有一些與其他方法不同的屬性有關的小型運行時實現細節,但爲了討論的目的,僅考慮「我有一個名爲_key
的ivar和一個名爲-key
的方法」。您通過聲明財產創建伊娃和方法的事實與valueForKey:
無關。
valueForKey:
是一種方法,它可以被一個類重寫以返回任何它喜歡的東西。 默認行爲是,valueForKey:
將首先查找名稱與密鑰匹配的方法,並將返回該結果。在絕大多數情況下,這意味着如果你有一個財產,那麼valueForKey:@"property"
將返回它的價值。
爲valueForKey:
默認實現全搜索路徑"Accessor Search Implementation Details"進行了說明,但這裏是「短」版:
get<Key>
,<key>
,is<Key>
(是的,首先它看起來是getKey
,這有點令人尷尬,因爲你不應該以get
爲前綴,除非他們通過引用返回值,但是你去了;它是第一件事檢查。)
countOf<Key>
,objectIn<Key>AtIndex:
和<key>AtIndexes
。如果找到這些的合法組合,則返回一個NSArray類似的代理對象。
countOf<Key>
,enumeratorOf<Key>
和memberOf<Key>:
。如果找到所有三個,則返回一個類似NSSet的代理對象。
如果accessInstanceVariablesDirectly
是YES
(默認值),那麼高德進行檢查,命名_<key>
,_is<Key>
,<key>
,或is<Key>
。是的,這是訪問對象的私有ivars的一種方式。
如果一切都失敗了,那麼它會調用valueForUndefinedKey:
,它可以自由地返回結果(如果你想要一個通用的鍵/值存儲,這實際上是一個非常有用的事情)。
但是十分之九,您將獲得名爲<key>
的方法的值。
附註:valueForKey:
返回一個對象。如果返回是一個類似數字的標量(包括BOOL
),它將返回NSNumber
。否則,它將返回一個NSValue
。有一些特殊處理NSPoint
,NSRange
,NSRect
和NSSize
(在Mac上;在iOS上,只有NSRange
是專門處理的,我相信)。
+1只複製文檔,但有用的摘要 –
怎麼樣obj.property = value?這相當於[obj setProperty:value]? – Boon
是的。點符號設置器被轉換爲相關的設置方法。 –
obj.property相同[OBJ性質],而不是[OBJ valueForKey:@ 「屬性」] ;.後者是一個稱爲Key Value Coding的系統的一部分,它與屬性分開。
它在運行時解決了什麼問題? class_getProperty? – Boon
與所有方法調用一樣,它可以解析爲objc_msgSend。屬性訪問只是方法調用。 –
class_getProperty會自省。它不用於調用任何東西 –
我很確定蘋果文檔中的某處描述了'valueForKey'如何在不同的平臺上工作。 –
有人可以反對,這是一個合法的編碼問題! – Boon