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

學(xué)習(xí)參考,如有錯誤,歡迎批評指正?。?!

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

一、關(guān)于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ā)!?。?=

13.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容