2013-10-22 41 views
0

Objective-C屬性在運行時解決了什麼問題?調用[obj valueForKey:@「property」]總會產生相同的結果嗎?Objective-C屬性在運行時解決了什麼問題?

例如

obj.property

+1

我很確定蘋果文檔中的某處描述了'valueForKey'如何在不同的平臺上工作。 –

+0

有人可以反對,這是一個合法的編碼問題! – Boon

回答

2

首先,請注意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的代理對象。

  • 如果accessInstanceVariablesDirectlyYES(默認值),那麼高德進行檢查,命名_<key>_is<Key><key>,或is<Key>。是的,這是訪問對象的私有ivars的一種方式。

  • 如果一切都失敗了,那麼它會調用valueForUndefinedKey:,它可以自由地返回結果(如果你想要一個通用的鍵/值存儲,這實際上是一個非常有用的事情)。

但是十分之九,您將獲得名爲<key>的方法的值。

附註:valueForKey:返回一個對象。如果返回是一個類似數字的標量(包括BOOL),它將返回NSNumber。否則,它將返回一個NSValue。有一些特殊處理NSPoint,NSRange,NSRectNSSize(在Mac上;在iOS上,只有NSRange是專門處理的,我相信)。

+1

+1只複製文檔,但有用的摘要 –

+0

怎麼樣obj.property = value?這相當於[obj setProperty:value]? – Boon

+0

是的。點符號設置器被轉換爲相關的設置方法。 –

0

obj.property相同[OBJ性質],而不是[OBJ valueForKey:@ 「屬性」] ;.後者是一個稱爲Key Value Coding的系統的一部分,它與屬性分開。

+0

它在運行時解決了什麼問題? class_getProperty? – Boon

+2

與所有方法調用一樣,它可以解析爲objc_msgSend。屬性訪問只是方法調用。 –

+1

class_getProperty會自省。它不用於調用任何東西 –

相關問題