继续上一篇文章。提纲:
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方法中调用。