iOS -- KVC取值賦值過程分析

學習參考,如有錯誤远荠,歡迎批評指正!Jⅰ譬淳!

KVC Key-Value Coding 鍵值編碼,可以通過一個key值來訪問某個屬性值

一根时、關于KVC的API

常見的API有一下幾個

- (void)setValue:(id)value forKeyPath:(NSString *)keyPath;

- (void)setValue:(id)value forKey:(NSString *)key;

- (id)valueForKeyPath:(NSString *)keyPath;

- (id)valueForKey:(NSString *)key;

二瘦赫、KVC的基本使用

基本使用

Person.h
@interface Cat : NSObject

@property (nonatomic, assign) int weight;
@end



@interface Person : NSObject

@property (nonatomic, assign) int age;
@property (nonatomic, assign) Cat *cat;
@end

Person.m

#import "Person.h"
@implementation Person

@end

@implementation Cat

@end
Person *person = [[Person alloc] init];
[person setValue:@10 forKey:@"age"];

Cat *cat = [[Cat alloc] init];
person.cat = cat;
[person setValue:@20 forKeyPath:@"cat.weight"];
     
NSLog(@"person.age = %@",[person valueForKey:@"age"]);
NSLog(@"person.cat.weight = %@",[person valueForKeyPath:@"cat.weight"]);

三、KVC的賦值原理

setValue:forKey的原理

  1. 會先按照setKey: 蛤迎、_setKey:的順序查找方法
    • 如果有這兩個方法中的其中一個确虱,則直接調(diào)用方法賦值
    • 如果沒有找到這兩個方法,則查看
      + (BOOL)accessInstanceVariablesDirectly;這個方法的返回值(默認是YES
  1. 如果+ (BOOL)accessInstanceVariablesDirectly;
    • 返回值是 NO替裆,不允許直接給成員變量賦值
      則會調(diào)用 setValue:forUndefinedKey:并拋出異常 NSUnknownKeyException
      1.png
  • 返回值是 YES校辩,允許直接給成員變量賦值
    • 會按照 _key, _isKey, key, isKey 順序查找成員變量賦值


      3.png
    • 如果沒有這四個中的任何一個,則


      5.png

四辆童、KVC的取值原理

valueForKey:原理

  1. 會先按照 getKey \ key \ isKey \ _key的順序查找方法

    • 如果有這幾個方法則宜咒,直接調(diào)用方法取值


      10.png
    • 如果沒有,則查看+ (BOOL)accessInstanceVariablesDirectly; 方法的返回值
  2. + (BOOL)accessInstanceVariablesDirectly;默認返回值是YES

    • 返回NO, 則拋出異常 NSUnknownKeyException 報錯 [XXX valueForUndefindedKey:]
      11.png
    • 返回YES, 則按照 _key \ _isKey \ key \ isKey 的順序去查找成員變量把鉴,如果找到則直接取值故黑,找不到則 報錯 同上

五庭砍、KVC能觸發(fā)KVO嗎场晶?

==會觸發(fā)!5「住诗轻!==

13.png
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市揭北,隨后出現(xiàn)的幾起案子扳炬,更是在濱河造成了極大的恐慌吏颖,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,000評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件恨樟,死亡現(xiàn)場離奇詭異半醉,居然都是意外死亡,警方通過查閱死者的電腦和手機劝术,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評論 3 399
  • 文/潘曉璐 我一進店門奉呛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人夯尽,你說我怎么就攤上這事〉锹” “怎么了匙握?”我有些...
    開封第一講書人閱讀 168,561評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長陈轿。 經(jīng)常有香客問我圈纺,道長,這世上最難降的妖魔是什么麦射? 我笑而不...
    開封第一講書人閱讀 59,782評論 1 298
  • 正文 為了忘掉前任蛾娶,我火速辦了婚禮,結果婚禮上潜秋,老公的妹妹穿的比我還像新娘蛔琅。我一直安慰自己,他們只是感情好峻呛,可當我...
    茶點故事閱讀 68,798評論 6 397
  • 文/花漫 我一把揭開白布罗售。 她就那樣靜靜地躺著,像睡著了一般钩述。 火紅的嫁衣襯著肌膚如雪寨躁。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,394評論 1 310
  • 那天牙勘,我揣著相機與錄音职恳,去河邊找鬼。 笑死方面,一個胖子當著我的面吹牛放钦,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播葡幸,決...
    沈念sama閱讀 40,952評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼最筒,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了蔚叨?” 一聲冷哼從身側響起床蜘,我...
    開封第一講書人閱讀 39,852評論 0 276
  • 序言:老撾萬榮一對情侶失蹤辙培,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后邢锯,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體扬蕊,經(jīng)...
    沈念sama閱讀 46,409評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,483評論 3 341
  • 正文 我和宋清朗相戀三年丹擎,在試婚紗的時候發(fā)現(xiàn)自己被綠了尾抑。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,615評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡蒂培,死狀恐怖再愈,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情护戳,我是刑警寧澤翎冲,帶...
    沈念sama閱讀 36,303評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站媳荒,受9級特大地震影響抗悍,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜钳枕,卻給世界環(huán)境...
    茶點故事閱讀 41,979評論 3 334
  • 文/蒙蒙 一缴渊、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧鱼炒,春花似錦衔沼、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至硬爆,卻和暖如春欣舵,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背缀磕。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評論 1 272
  • 我被黑心中介騙來泰國打工缘圈, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人袜蚕。 一個月前我還...
    沈念sama閱讀 49,041評論 3 377
  • 正文 我出身青樓糟把,卻偏偏與公主長得像,于是被迫代替她去往敵國和親牲剃。 傳聞我的和親對象是個殘疾皇子遣疯,可洞房花燭夜當晚...
    茶點故事閱讀 45,630評論 2 359