首先,KVC是鍵值對編碼醒第,是NSObject的非常正式協(xié)議渔嚷。
@property(class,readonly)BOOL accessInstanceVariablesDirectly
這個方法默認(rèn)是YES,如果在自己的類中重寫了稠曼,修改了返回值為NO形病,如果不存在這個值,就不會繼續(xù)執(zhí)行查找規(guī)制。
- (nullable id)valueForKey:(NSString*)key
這個要看第一個方法accessInstanceVariablesDirectly的值漠吻,如果是YES量瓜,就要繼續(xù)執(zhí)行查找鏈了。
先按這個順序進(jìn)行查找-get<key>, -<key>, or -is<key>,獲取getter值途乃。如果是簡單類型榔至,例如Bool和Int等,就要轉(zhuǎn)換成NSNumber類型欺劳,如果是NSPoint, NRange, NSRect, and NSSize要轉(zhuǎn)換成NSValue類型。
如果getter值沒有找到铅鲤,進(jìn)行-countOf<key>和-indexIn<key>OfObject划提、-objectIn<key>AtIndex這些方法查找,如果找到了邢享,就進(jìn)行NSArray數(shù)組進(jìn)行操作鹏往。其中-indexInOfObject、-objectInAtIndex這兩個方法只要實(shí)現(xiàn)一個就行了骇塘。如果get<key>:range:方法響應(yīng)了伊履,這個不是數(shù)組操作。
如果上面方法還是沒有找到款违,進(jìn)行-countOf<key>?和 -enumeratorOf<key>:唐瀑、memberOf<key>響應(yīng)的時候,要進(jìn)行NSSet進(jìn)行操作插爹。
如果上面方法還是沒有找到哄辣,進(jìn)行_<key>,_is<key>,is<key>的順序進(jìn)行搜索成員變量名。
如果上面方法還是沒有收到赠尾,就要跳轉(zhuǎn)到valueForUndefinedKey這個方法力穗。
下面講解- (void)setValue:(nullableid)value forKey:(NSString*)key這個方法
在設(shè)置值的時候,首先查找-set<key>:方法气嫁,如果沒有找到当窗,要看accessInstanceVariablesDirectly是否為YES,如果是NO寸宵,結(jié)束查找崖面,如果是YES,要繼續(xù)查找,沒有找到邓馒,要調(diào)用setValue:forUndefinedKey這個方法嘶朱,在這個方法中進(jìn)行是否設(shè)置。如果定義_<key>光酣,進(jìn)行賦值疏遏。
如果沒有上面的方法,要進(jìn)行_is<key>,_<key>?, 或者 is<key>賦值,如果設(shè)置變量是bool和int等變量類型時财异,就要在setNilValueForKey方法中進(jìn)行NSNumber或者NSValue封裝倘零。
如果上面方法成功,就要setValue:forUndefinedKey:這個方法戳寸,如果不調(diào)用呈驶,程序會崩潰的。
- (BOOL)validateValue:(inoutid_Nullable*_Nonnull)ioValue forKey:(NSString*)inKey error:(outNSError**)outError
這個方法如果不重寫疫鹊,就一直返回YES袖瞻。如果重寫了這個方法,就要在這個方法中進(jìn)行key-value值判斷拆吆。
- (NSMutableArray*)mutableArrayValueForKey:(NSString*)key
這個方法聋迎,如果能響應(yīng),就能調(diào)用-insertObject:inAtIndex: and -removeObjectFromAtIndex:這兩個方法枣耀,實(shí)質(zhì)就是操作的是NSMutableArray數(shù)組類插入和刪除方法霉晕。
如果不能響應(yīng),就要-set<key>:方法捞奕,如果能響應(yīng)牺堰,就發(fā)送給NSMutableArray數(shù)組,然后在調(diào)用-set:方法賦值颅围。
如果上面還是不能響應(yīng)伟葫,就要看accessInstanceVariablesDirectly是否返回YES,如果返回NO院促,結(jié)束查找扒俯。如果返回YES,繼續(xù)查找_<key>,<key>成員變量名一疯,如果能找到撼玄,就發(fā)送NSMutableArray信息,進(jìn)行處理墩邀。
如果上面不能響應(yīng)掌猛,就要valueForUndefinedKey這個方法。
- (NSMutableSet*)mutableSetValueForKey:(NSString*)key
這個方法眉睹,如果能響應(yīng)返回是NSMutableSet荔茬,就能調(diào)用這兩個-add<key>Object: 和 -remove<key>Object,對應(yīng)-[NSMutableSet unionSet:] 和 -[NSMutableSet minusSet:]兩個方法。還有兩個可選的方法-intersect<key>: or -set<key>:都是調(diào)用的竹海。
如果不能響應(yīng)慕蔚,就要-set:方法,如果能響應(yīng)斋配,就發(fā)送給NSMutableSet孔飒,然后在調(diào)用-set:方法賦值灌闺。
如果上面還是不能響應(yīng),就要看accessInstanceVariablesDirectly是否返回YES坏瞄,如果返回NO桂对,結(jié)束查找。如果返回YES鸠匀,繼續(xù)查找_<key>,<key>成員變量名蕉斜,如果能找到,就發(fā)送NSMutableSet信息缀棍,進(jìn)行處理宅此。
如果上面不能響應(yīng),就要valueForUndefinedKey這個方法爬范。
- (void)setNilValueForKey:(NSString*)key
如果是設(shè)置簡單變量的時候诽凌,就要在這個方法中進(jìn)行重新設(shè)置。
- (void)setValuesForKeysWithDictionary:(NSDictionary *)keyedValues
這個方法就是先要定義一個字典變量和類中成員變量一一對應(yīng)的坦敌。如果在字典中設(shè)置變量找不到類中的成員變量,就會調(diào)用- (void)setValue:(nullableid)value forUndefinedKey:(NSString*)key這個方法痢法。
kvc應(yīng)用在UITextField等一些控件屬性修改狱窘。例如修改UITextField的placeholder文本顏色和字體大小。將字典與model相互轉(zhuǎn)換财搁。