Object-C学习笔录(三)NSKeyValueCoding(KVC)协议与NSKeyValueObserving(KVO)协议

本文详细介绍了Objective-C中的KVC(NSKeyValueCoding)和KVO(NSKeyValueObserving)协议。KVC提供了一种灵活的属性操作方式,而KVO则实现了对象属性的观察与监听。通过KVC,开发者可以使用setValue:forKey:和valueForKey:方法直接访问和修改对象的属性,包括复合属性。KVO则允许在属性改变时接收到通知,通过addObserver:forKeyPath:option:context:注册监听,并覆写observeValueForKeyPath:ofObject:change:context:来处理变化。

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

继续上一篇文章。提纲:

1.NSKeyValueCoding(KVC)协议

2.NSKeyValueObserving(KVO)协议


1.NSKeyValueCoding(KVC)协议

KVC主要是提供一种更为灵活的对象属性的操作方式。要使用KVC需要遵循NSKeyValueCoding协议,不过由于NSObject已经支持了该协议,而所有的类都继承NSObject;注意:这种对属性对操作方式可能使得对象的封装特性失去作用;

1.1KVC的使用

比如说有一个对象man,man对象里有identifier属性;那么可以通过 [man setValue:@"450923199933000" forKey:@"identifier"];为identifier设置属性值,然后如果要取identifier的值可以通过 [man valueForKey:@"identifier"];

如果man对象里面有个Address类的对象属性address(住址);address对象里属性有个NSString *home属性;属性中的属性,也可以称作复合属性;则可以这么使用操作home属性 [man setValue: @“北京”forKey:@"address.home"];获取home的值:[man valueForKey:@"address.home"];

1.2 KVC运行的机制:

1)对于setValue: ForKey:方法的原理如下

首先程序会搜索“setIdentifer”方法,如果有则执行setter,整个操作完成;如果没有setIdentifier方法,则会搜索名为“_ identifier”成员变量(无论该变量事在类的接口部分声明的还是在类的实现部分声明的),无论是什么修饰符(@private/@protected等),如果有则执行赋值操作;整个操作完成;如果没有“_identifier”属性;则会继续搜索名为“identifier”的成员变量,也无论是什么修饰符(@private/@protected等);如果有,则执行赋值操作,整个操作完成;如果都没有,则会执行对象的“setValue:ForUndefineKey:”方法。而默认的“setValue:ForUndefinedKey:”实现只是抛出一个NSUnknownKeyException异常。覆写该方法即可。

2)对于valueForKey方法的执行原理:

首先程序会搜索“identifer”方法,如果有则执行identifier方法返回其值,整个操作完成;如果没有identifier方法,则会搜索名为“_ identifier”成员变量(无论该变量事在类的接口部分声明的还是在类的实现部分声明的),无论是什么修饰符(@private/@protected等),如果有则返回其值;整个操作完成;如果没有“_identifier”属性;则会继续搜索名为“identifier”的成员变量,也无论是什么修饰符(@private/@protected等);如果有,则执行返回其值,整个操作完成;如果都没有,则会执行对象的“valueForUndefinedKey:”方法。而默认的“setValue:ForUndefineKey:”实现只是抛出一个NSUnknownKeyException异常。覆写该方法即可。

2.NSKeyValueObserving(KVO)协议

要使用KVO需要遵循NSKeyValueObserving协议,不过由于NSObject已经支持了该协议,而所有的类都继承NSObject;

使用很简单,首先通过addObserver:forKeyPath option:context: 方法注册一个监听器;然后覆写observeValueForKeyPath:ofObject:change:context:方法;最后当程序退出时别忘了调用removeObserver:forKeyPath:context:方法或者removeObserver:forKeyPath:方法删除监听;一般这两个删除监听的方法是在dealloc方法中调用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值