KVC键值对编码
kvc键值对编码就是在对象没有声明属性(毕竟能用点方法没几个人会再去用kvc),成员变量没有公有化,并且没有写描述方法时使用的一种给 成员 变量或者属性 赋值的一种方式。
例如:
//我们创建了一个学生类,并将其实例化 Student *stu = [[Student alloc]init]; //给学生队形的name成员变量使用kvc赋值 [stu setValue:@"ss" forKey:@"name"]; //取出使用键值对进行赋值了的name成员变量的值 NSLog(@"%@",[stu valueForKey:@"name"]);
如果此时学生有一本书,并且这个书有名字,那我们该怎么在学生对象中输出这本书的名字呢
//首先要用下面这个方法给书的名字进行赋值 [stu setValue:@"语文" forKeyPath:@"book.name"]; //而且要在学生类中定义一个book类的对象,而且这个变量的name的成员变量必须要添加@public或者定义属性,否则学生类中无法访问book的name Book *book ;
KVO键值观察
没有kvc就没有kvo,当对象属性或者成员变量的值通过kvc发生变化时,kvo就会观察到值的变化,并且做出反应
kvo有三个步骤:
要另外写一个观察者类
1.注册成为观察者
1 -(void)registerWatch{ 2 //第一个参数:被观察的对象,第二个参数:观察者的对象,第三个参数:被观察的对象的属性或者变量名,第四个参数:接收到变化的通知时,给我们展示的内容 3 [_stu addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:nil]; 4 }
2.重写observeValueForKeyPath方法
1 -(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{ 2 NSLog(@"%@",keyPath);//(被观察者)发生改变的变量或属性名 3 4 NSLog(@"%@",object);//被观察者 5 NSLog(@"%@",change);//属性或变量改变前后的值(字典)new:改变后 old:改变前 6 NSLog(@"%@",[change objectForKey:@"new"]); 7 }
3.移除kvo
-(void)dealloc{ //移除kvo [_stu removeObserver:self forKeyPath:@"name"]; }
如何使用kvo:
在主函数中实例化一个观察者对象,将其注册成为观察者对象
如果被观察者的成员变量活着属性发生变化就会根据observeValueForKeyPath方法输出相应内容
通知
通知模式就是通知中心发送信息,如果观察者(接受信息者)监听(接收)到了信息,那么会做出一定的回应
通知模式的使用:
1. 注册通知
-(void)addNotifi{ //在通知中心注册通知:第一个参数,代表通知接收对象,第二个参数:代表接收到通知后调用的方法,第三个参数:代表通知的名字 最后一个参数不用管,直接给nil [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(receive:) name:@"Notifi" object:nil]; }
2.接收到信息作出反应的方法
//如果通知包含参数,那么方法定义时,需要一个通知的对象作为参数 -(void)receive:(NSNotification *)note{ NSLog(@"收到通知"); // NSLog(@"%@",note.object);//此处的note.object就代表发送通知时传过来的信息 // 传过来的是什么类型的参数,我们就用什么类型的变量进行处理 // NSDictionary *dic = note.object; // NSLog(@"--%@",dic); NSLog(@"%@",note.userInfo);//此处的userinfo就代表发送通知时,传过来的userinfo }
3.移除通知
-(void)dealloc{ //移除通知,避免消耗内存 ,第一个参数,代表之前注册的通知接收对象,第二个参数,代表注册时写的通知名字 [[NSNotificationCenter defaultCenter] removeObserver:self name:@"Notifi" object:nil]; }
通知模式的使用
在main函数中
Student *stu = [Student new]; //将学生对象添加为观察者(监听者) [stu addNotifi]; //第一个参数:传入通知名字,告诉通知中心,给哪个通知发消息,注意,此处的名字要与之前注册的名字完全一致,第二个参数,代表发送通知时附带的参数或信息 NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys:@"1",@"a", nil]; // [[NSNotificationCenter defaultCenter] postNotificationName:@"Notifi" object:dic]; //userInfo是通知的一个变量,也可以用来传参 [[NSNotificationCenter defaultCenter]postNotificationName:@"Notifi" object:nil userInfo:dic];
kvo与通知模式的比较:
通知模式是由通知中心发送(不可控),kvo是由kvc进行赋值(可控)