KVC總結(jié)

首先,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)換财搁。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蘸炸,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子尖奔,更是在濱河造成了極大的恐慌搭儒,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件提茁,死亡現(xiàn)場離奇詭異淹禾,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)茴扁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進(jìn)店門铃岔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人峭火,你說我怎么就攤上這事毁习。” “怎么了卖丸?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵纺且,是天一觀的道長。 經(jīng)常有香客問我稍浆,道長载碌,這世上最難降的妖魔是什么猜嘱? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮恐仑,結(jié)果婚禮上泉坐,老公的妹妹穿的比我還像新娘。我一直安慰自己裳仆,他們只是感情好腕让,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著歧斟,像睡著了一般纯丸。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上静袖,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天觉鼻,我揣著相機(jī)與錄音,去河邊找鬼队橙。 笑死坠陈,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的捐康。 我是一名探鬼主播仇矾,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼解总!你這毒婦竟也來了贮匕?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤花枫,失蹤者是張志新(化名)和其女友劉穎刻盐,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體劳翰,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡敦锌,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了佳簸。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片供屉。...
    茶點(diǎn)故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖溺蕉,靈堂內(nèi)的尸體忽然破棺而出伶丐,到底是詐尸還是另有隱情,我是刑警寧澤疯特,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布哗魂,位于F島的核電站,受9級特大地震影響漓雅,放射性物質(zhì)發(fā)生泄漏录别。R本人自食惡果不足惜朽色,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望组题。 院中可真熱鬧葫男,春花似錦、人聲如沸崔列。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽赵讯。三九已至盈咳,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間边翼,已是汗流浹背鱼响。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留组底,地道東北人丈积。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像债鸡,于是被迫代替她去往敵國和親江滨。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評論 2 355

推薦閱讀更多精彩內(nèi)容