1.賦值時(shí)的調(diào)用順序:
當(dāng)調(diào)用setValue:屬性值 forKey:@”name“的代碼時(shí)抹腿,底層的執(zhí)行機(jī)制如下:
程序有限調(diào)用setName:方法,代碼通過(guò)name的setter方法完成設(shè)置;
如果沒(méi)有找setName:方法,KVC會(huì)檢查+ (BOOL)accessInstanceVariablesDirectly是否返回未YES,默認(rèn)會(huì)返回YES,如果重寫(xiě)該方法返回NO的話,那么在這一步KVC會(huì)執(zhí)行setValue:forUndefinedKey:方法,不過(guò)一般都不這么做.返回YES之后,KVC機(jī)制會(huì)搜索該類里邊有沒(méi)有_name的成員變量,如果有就賦值;
如果該類既沒(méi)有setName:,也沒(méi)有_name,KVC就會(huì)搜索_isName的成員變量;
如果沒(méi)有setName:方法,也沒(méi)有_name和_isName成員變量,KVC會(huì)繼續(xù)搜索name和isName變量,然后賦值;
如果以上方法或者成員變量都不存在,系統(tǒng)將會(huì)執(zhí)行該對(duì)象的setValue:forUndefinedKey:方法岛请,默認(rèn)是拋出異常。
2.取值時(shí)
首先會(huì)按getName,name,isName的順序查找getter方法,找到的話會(huì)直接調(diào)用;
如果上邊沒(méi)找到,KVC則會(huì)查找countOfName,objectInNameAtIndex或nameAtIndexes格式的方法警绩。如果countOfName方法和另外兩個(gè)方法中的一個(gè)被找到崇败,那么就會(huì)返回一個(gè)可以響應(yīng)NSArray所有方法的代理集合(它是NSKeyValueArray,是NSArray的子類),調(diào)用這個(gè)代理集合的方法后室,或者說(shuō)給這個(gè)代理集合發(fā)送屬于NSArray的方法缩膝,就會(huì)以countOfName,objectInNameAtIndex或nameAtIndexes這幾個(gè)方法組合的形式調(diào)用。還有一個(gè)可選的getName:range:方法岸霹。所以你想重新定義KVC的一些功能疾层,你可以添加這些方法,需要注意的是你的方法名要符合KVC的標(biāo)準(zhǔn)命名方法贡避,包括方法簽名;
如果上面的方法沒(méi)有找到痛黎,那么會(huì)同時(shí)查找countOfName,enumeratorOfName,memberOfName格式的方法刮吧。如果這三個(gè)方法都找到湖饱,那么就返回一個(gè)可以響應(yīng)NSSet所的方法的代理集合,和上面一樣杀捻,給這個(gè)代理集合發(fā)NSSet的消息井厌,就會(huì)以countOfName,enumeratorOfName,memberOfName組合的形式調(diào)用致讥。