[oc学习日记]kvc,kvo和通知

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进行赋值(可控)

时间: 2024-10-21 16:00:38

[oc学习日记]kvc,kvo和通知的相关文章

黑马程序员-OC学习日记-对象与方法、对象与函数

------- ios培训. android培训.java培训.期待与您交流! ---------- 一.NSString类简介 1.NSString是OC中用来表示字符串的一个类 2.NSString类创建 (1)通过字面量方式创建 NSString * str = @"要努力学习!"; (2)通过对象方法创建 NSString * str1 = [NSString alloc]; str1 = [str1 initWithUTF8String:"今天雾霾好大!"

QF——OC中的KVC,KVO

KVC: (Key Value Coding) 键值编码 所谓KVC,其实就是不通过set和get方法访问属性,而是通过其他几个方法. 之所以每个对象都有KVC能力,是因为NSObject类实现了NSKeyValueCoding协议. 属性赋值: setValue:属性值 forKey:属性名 属性读取:   valueForKey:属性名 KVO:(Key Value Observer)键值监听 KVO的实现是因为NSObject类实现了NSKeyValueObserver协议,所以每个类都有

黑马程序员-OC学习日记-继承、多态

------- ios培训. android培训.java培训.期待与您交流! ---------- 一.两个关键字self和super 1.局部变量与成员变量 (1)在方法内部可以定义与成员变量同名的局部变量. 在局部变量作用域内,会覆盖成员变量 (2)如果在方法内部定义了与成员变量同名的局部变量. 通过self访问成员变量,以区别局部变量 (3)全局变量是整个文件共享的,如果在一个方法中修改全局变量,在其他方法中使用这个全局变量都会修改 (4)就近原则: 查找顺序:局部变量  ->  成员变

[oc学习日记]字典

1 //字典的创建 2 NSDictionary *d1 = [NSDictionary dictionary]; 3 //将创建的字典的内容设置为制定的文件的内容 4 NSString *path = @"";//文件路径 5 NSDictionary *d2 = [NSDictionary dictionaryWithContentsOfFile:path]; 6 //创建具有一个键值的字典 7 NSDictionary *d3 = [NSDictionary dictionary

[oc学习日记]单例模式

首先来了解一下单例模式的概念 单例模式就是保证系统中只存在一个对象(只有一个地址)的模式 下面我们就由一个学生类举例说明 因为要保证系统只有一个对象就要重写对象的创建方法,对象的拷贝方法 1 #import <Foundation/Foundation.h> 2 //因为要重写拷贝方法,所以要遵循拷贝协议 3 @interface Student : NSObject<NSCopying,NSMutableCopying> 4 +(id)create;//声明创建对象的方法 5 @

[oc学习日记]代理模式

何为代理模式,代理模式也成委托模式 代理模式顾名思义,就是一个人让另一个个人帮助他做某事 我们下面就用一个代购的故事为大家讲解代理模式 1.首先我们要创建一个协议,该协议具有具体功能(代购的功能) 1 #import <Foundation/Foundation.h> 2 //声明协议 3 @protocol delegate <NSObject> 4 //协议中代购的方法 5 -(void)buy; 6 @end 2.谁可以实现这个功能,就让这个类去遵循这个协议(在这个例子中,代

OC学习篇之---KVC和KVO操作

前一篇文章我们介绍了OC中最常用的文件操作:http://blog.csdn.net/jiangwei0910410003/article/details/41875015,那么今天来看一下OC中的一个比较有特色的知识点:KVC和KVO 一.KVC操作 OC中的KVC操作就和Java中使用反射机制去访问类的private权限的变量,很暴力的,这样做就会破坏类的封装性,本来类中的的private权限就是不希望外界去访问的,但是我们这样去操作,就会反其道而行,但是我们有时候真的需要去这样做,哎.所以

(转载)OC学习篇之---KVC和KVO操作

前一篇文章我们介绍了OC中最常用的文件操作,那么今天来看一下OC中的一个比较有特色的知识点:KVC和KVO 一.KVC操作 OC中的KVC操作就和Java中使用反射机制去访问类的private权限的变量,很暴力的,这样做就会破坏类的封装性,本来类中的的private权限就是不希望外界去访问的,但是我们这样去操作,就会反其道而行,但是我们有时候真的需要去这样做,哎.所以说有些事不是都是顺其自然的,而是需要的时候自然就诞生了. 下面就来看一下这种技术的使用: Dog.h 1 // 2 // Dog.

OC学习篇之---总结和学习目录

今天终于把OC的基础知识学习完了,但是这些知识只是最基础的,还有很多高级知识,这个可能需要后面慢慢的去学习才能体会到.下面就是这次学习OC的目录教程,如果大家发现有什么不正确的地方,请指正,小弟是新生,多请OC老鸟来喷~~ 1.OC学习篇之---概述 2.OC学习篇之---第一个程序HelloWorld 3.OC学习篇之---类的定义 4.OC学习篇之---类的初始化方法和点语法的使用 5.OC学习篇之---类的三大特性(封装,继承,多态) 6.OC学习篇之[email protected]关键