KVC与KVO理解

本文介绍了Objective-C中Key-Value Coding (KVC) 的基本概念及其使用方法,并通过实例展示了如何利用KVC进行属性访问。同时,文章还深入探讨了基于KVC的关键技术——Key-Value Observing (KVO),并通过示例演示了如何使用KVO来观察对象属性的变化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Key-Value Coding(KVC)

KVC,是指 NSKeyValueCoding,NSObject 的分类, NSObject(NSKeyValueCoding) ,提供一种机制来间接访问对象的属性和值。KVO是基于KVC实现的关键技术之一。

例如:一个Person对象有一个name和一个age属性,一个book对象,

   Person *p = [[Person alloc] init];

    p.name = @"Jack";

    p.age = 10;

    Book *book=[[Book alloc] init];

    book.name=@"倾城之恋";

    p.book=book;



NSString *presonName=[p valueForKeyPath:@"name"];

NSLog(@"presonName-----%@",presonName);

打印如下:

presonName-----Jack


NSString *bookName=[[p valueForKey:@"book"] valueForKey:@"name"];等价于

NSString *presonName=[p valueForKeyPath:@"book.name"];


NSLog(@"bookName-----%@",bookName);


打印如下:

bookName-----倾城之恋

注意:key和key path的区别,key可以从一个对象获取值,而 key path  可以将多个key用点号“.”分开



Key-Value Observing (KVO)

Key-Value Observing (KVO)建立在kvc之上,它能够观察一个对象key path值得改变

例如:


- (void)viewDidLoad

{

    [super viewDidLoad];

    HMPerson *p = [[HMPerson alloc] init];

    p.age = 20;

      //实现观察

    [p addObserver:self forKeyPath:@"age" options:NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew context:nil];

    //改变值

    p.age = 30;

    self.p = p;

}


   //停止观察

- (void)dealloc

{

    [self.p removeObserver:self forKeyPath:@"age"];

}


/**

 *  当监控的某个属性的值改变了就会调用

 *

 *  @param keyPath 属性名(哪个属性改了?)

 *  @param object  哪个对象的属性被改了?

 *  @param change  属性的修改情况(属性原来的值、属性最新的值)

 *  @param context void * == id

 */

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context

{

    NSLog(@"%@对象的%@属性改变了:%@", object, keyPath, change);

}


打印如下:

 <HMPerson: 0x7fac02ce0d20>对象的age属性改变了:{

    kind = 1;

    new = 30;

    old = 20;

}















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值