KVC
鍵值對編碼蒲稳,實現(xiàn)步驟頭文件中說得很明白了瞭郑,以下是個人翻譯辜御。
-setValue:ForKey:
1、找方法和參數(shù)類型判斷屈张。先去類中找有沒有-setXXX的方法擒权。有,就要進行參數(shù)類型檢查阁谆。如果參數(shù)不是對象指針類型或值為nil菜拓,則調(diào)用-setNilValueForKey,它默認的是實現(xiàn)是拋出一個異常NSInvalidArgumentException笛厦。但是呢纳鼎,你可以重寫-setNilValueForKey這個方法。參數(shù)沒問題裳凸,方法也找到了贱鄙,就簡單的調(diào)用啦。最后一句大概意思說姨谷,如果是基本數(shù)據(jù)類型逗宁,會被轉(zhuǎn)換成OC數(shù)據(jù)類型。暫時還未去驗證梦湘。
2瞎颗、找實例變量。沒找到方法實現(xiàn)捌议,就去找變量哼拔。在找變量前,先調(diào)用+accessInstanceVariablesDirectly瓣颅。如果返回YES倦逐,就去找,找的順序是這樣的:_<key>宫补, _is<key>檬姥, <key>曾我, is<key>,如果是實例變量健民,會先release舊值抒巢,retain新值,找不到秉犹,進入步驟3虐秦;如果返回NO,不用找了凤优,進入步驟3悦陋。
3、方法也沒得筑辨、變量也沒找到俺驶,或者+accessInstanceVariablesDirectly返回了NO,調(diào)用-setValue:forUndefinedKey棍辕,默認拋出NSUndefinedKeyException暮现,當然,你也可以重寫它楚昭。
- (nullable id)valueForKey:key;
1栖袋、找方法。找的順序是這樣的-get<key>抚太, -<key>塘幅, or -is<key>。找到了就調(diào)用尿贫,全劇終电媳。后面一大堆說的是,如果返回結(jié)果是基本數(shù)據(jù)類型庆亡,要被轉(zhuǎn)換成對象指針類型匾乓。
2、1中沒找到又谋,就分別找類的-countOf<key> 和 -indexIn<key>OfObject: 和 -objectIn<key>AtIndex: (匹配NSOrderedSet 類定義的私有方法) 和 -<key>AtIndexes: (匹配 -[NSOrderedSet objectsAtIndexes:])拼缝。前兩個被找到、后面一個至少一個被找到彰亥,就會返回一個響應所有NSOrderedSet方法的代理對象咧七。一旦代理對象會把收到NSOrderedSet消息就會把前面四個方法發(fā)送給原來的類(valueForKey:的接受者)。如果原類實現(xiàn)了-get:range:這個方法剩愧,那么會在合適的地方調(diào)用猪叙。
3娇斩、4仁卷、是MAC OS 10.4的方法穴翩,2是10.7的方法,3锦积、4暫時不翻譯芒帕。
5、找實例變量丰介。如果+accessInstanceVariablesDirectly得返回YES背蟆,那么你才可以去找:順序是這樣的:_<key>, _is<key>哮幢,<key>?带膀, is<key>。找到了橙垢,那么久調(diào)用垛叨,如果有需要同樣會像1那樣進行類型轉(zhuǎn)換。
6柜某、方法也沒找到嗽元、2也失敗了、+accessInstanceVariablesDirectly返回了NO喂击、變量也沒找到剂癌,只有調(diào)用-valueForUndefinedKey:,默認拋出NSUndefinedKeyException翰绊,當然佩谷,你也可以重寫它。
后記
本文僅做個人翻譯监嗜,肯定有翻得不對的地方琳要。另外僅做了部分驗證,比如秤茅,+accessInstanceVariablesDirectly返回了NO你就不能KVC了稚补,重寫-setNilValueForKey、-setValue:forUndefinedKey和-valueForUndefinedKey就不會拋出異常了框喳。有時間课幕、能力再去深入研究。嗯五垮。拜了個拜乍惊。