KVC

KVC的全称是Key-Value Coding,俗称“键值编码”,可以通过一个key来访问某个属性

KVC主要用到的方法

//	赋值方法
- (void)setValue:(id)value forKey:(NSString *)key;
- (void)setValue:(id)value forKeyPath:(NSString *)keyPath;
//	取值方法
- (id)valueForKey:(NSString *)key;
- (id)valueForKeyPath:(NSString *)keyPath;
//	找不到key、keyPath时调用方法
- (id)valueForUndefinedKey:(NSString *)key

KVC赋值的流程

在这里插入图片描述

KVC取值的流程

在这里插入图片描述

示例代码
@interface TBStudent : NSObject

@property (nonatomic, assign) int number;

@end

@implementation TBStudent

@end

@interface TBPerson : NSObject
{
    @public
    NSString *name;
}

@property (nonatomic, strong) TBStudent *student;

@end

@implementation TBPerson

- (void)willChangeValueForKey:(NSString *)key{
    [super willChangeValueForKey:key];
    NSLog(@"willChangeValueForKey:%@",key);
}

- (void)didChangeValueForKey:(NSString *)key{
    NSLog(@"didChangeValueForKey:%@ --- begin",key);
    [super didChangeValueForKey:key];
    NSLog(@"didChangeValueForKey:%@ --- end",key);
}

// 默认返回YES
+ (BOOL)accessInstanceVariablesDirectly{
    return YES;
}

@end

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    TBPerson *person = [[TBPerson alloc] init];
    person->name = @"11";
    //  如果要使用keyPath赋值,必须要初始化才有效
    person.student = [[TBStudent alloc] init];
    //  添加KVO
    NSKeyValueObservingOptions options = NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew;
    [person addObserver:self forKeyPath:@"name" options:options context:nil];
    //  KVC赋值
    [person setValue:@"22" forKey:@"name"];
    [person setValue:@33 forKeyPath:@"student.number"];
    //  KVC取值
    NSLog(@"TBPerson -- name:%@",[person valueForKey:@"name"]);
    NSLog(@"TBStudent -- number:%@",[person valueForKeyPath:@"student.number"]);
}

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context{
    NSLog(@"监听到%@的%@属性由%@变化为%@",object,keyPath,change[NSKeyValueChangeOldKey],change[NSKeyValueChangeNewKey]);
}

@end

//	打印结果
KVC[85973:4686513] willChangeValueForKey:name
KVC[85973:4686513] didChangeValueForKey:name --- begin
KVC[85973:4686513] 监听到<TBPerson: 0x600001a9c2c0>的name属性由11变化为22
KVC[85973:4686513] didChangeValueForKey:name --- end
KVC[85973:4686513] TBPerson -- name:22
KVC[85973:4686513] TBStudent -- number:33

============================== 补充 ==============================
1、KVC赋值的过程猜测
	1.1[self willChangeValueForKey:@"name"];
	1.2、修改成员变量的值
	1.3[self didChangeValueForKey:@"name"];
		1.3.1、didChangeValueForKey:方法里面做的操作(通知监听器)
			  [observe observeValueForKeyPath:@"name" ofObject:self change:nil context:nil];
** 由KVC的赋值过程可以判断 --- 通过KVC修改属性(成员变量)的值是会触发KVO的;
	
PS 此文为学习 李明杰 老师的 iOS底层原理课程 所写笔记
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值