您的位置:首页 > 其它

OC中的KVC和KVO

2016-08-15 18:27 232 查看

简介

KVC(Key-Value Coding)和KVO(Key-Value Observing)是OC中最强大最实用的功能之一。目前为止,可以通过存取方法,属性或者直接设置实例变量来直接更改对象状态,也可以通过字符串模式来更改对象zhaungtai,这种方式称为键值编码(KVC)。KVC提供了一种在运行时而非编译时动态访问对象属性与实例变量的方式。

设计模式

观察者模式:

1、什么是观察者模式

在工程中,一些类(假设有B\C\D类)去观察A类,当A类发生变化的时候,这些类就会收到消息,做出相应的反应。

2、什么时候使用观察者模式?

当一个类需要发送消息给多个类的时候,就用观察者模式。

3、观察者模式的用途?

一对多的消息发送。

4、OC中怎么去实现观察者模式?

OC中观察者模式的设计基础 KVC/KVO

KVC

键值编码(KVC)中基本调用包括setValue:forKey和valueForKey:两个方法:

setValue:forKey:方法以字符串的形式向对象发送消息,可以设置对象实例变量的值。第一个参数为设置的值,第二个参数为字符串,是对象的属性名称或者实例变量名称;

valueForKey:方法以字符串形式向对象发送消息,用于获取对象中实例变量的值。参数为字符串,是对象的属性名称或者实例变量名称。

例:创建一个工程,并创建两个类Student类和Book类

1、Book类中有一个成员变量—bookName



2、在Student类内中导入Book类,并作为Student类类的成员变量


3、在ViewController函数中对功能进行实现

//kvc方式进行赋值
Student *stu1=[Student new];
[stu1 setValue:@"jack" forKey:@"_name"];
[stu1 setValue:@25 forKey:@"_age"];
[stu1 setValue:@"gz" forKey:@"_addStress"];

//访问
NSString *name=[stu1 valueForKey:@"_name"];
NSNumber *age=[stu1 valueForKey:@"_age"];
NSString *addStress=[stu1 valueForKey:@"_addStress"];
NSLog(@"%@ %@ %@",name,age,addStress);

//通过键获取对应的值
stu1.p1=11;
stu1.p2=22;
stu1.p3=33;
int a=[stu1 getValuePropertyName:@"p1"];
NSLog(@"%d",a);
int b= [stu1 getNewValuePropertyName:@"p1"];
NSLog(@"b=%d",b);
//键路径编码,当获取的键值或者设置的键值是类中可直接获得的,则用forKey 方法,若需要获取的键值或者设置键值的是成员变量内的内容(该成员变量为一个类,其中有成员变量)则用forKeyPath
Book *book=[[Book alloc]init];
[stu1 setValue:book forKeyPath:@"_book"];
[stu1 setValue:@"毛概" forKeyPath:@"_book._bookName"];
NSString *str=[stu1 valueForKeyPath:@"_book._bookName"];
NSLog(@"%@",str);


KVO

KVO的由来

在编程的过程中,我们经常需要判断目标是否发生变化,以便及时的做出对应的处理,此时苹果公司就提供了一种策略,即“OC运行时”提供了KVO技术,其中KVO是机遇KVC的实现。

KVO的实现

1、注册成为观察者

2、观察者定义KVO回调

3、移除观察者

例:新建一个工程,创建两个类Hero类和Observer类,其中Observer类是观察者,Hero类为被观察者。

1、创建一个Hero类,并设置一个成员变量HP

@interface Hero : NSObject

{

NSInteger _HP;

}

@end

2、创建一个观察者Observer类,导入Hero类,并设置一个hero成员变量,根据KVO实现中第一步,写一个注册观察者的初始化方法

@interface Observer : NSObject

{

Hero *_hero;

}

@property(nonatomic,strong)Hero *hero;

-(id)initWithHero:(Hero*)hero;//注册观察者初始化方法

@end

3、实现观察者Observer类中的方法

@implementation Observer

//注册成为观察者

-(id)initWithHero:(Hero *)hero

{

if (self=[super init]) {

// 参数1:表示接受对象,即观察者,一般为self;参数2:键路径参数,为观察的目标;参数3:标志KVO希望变化如何传递给观察者,这些值可以使用”|”进行传值多选;参数4:通常为nil

self.hero=hero;

[self.hero addObserver:self forKeyPath:@”_HP” options:NSKeyValueObservingOptionNew context:nil];

}

return self;

}

4、实现回调方法

-(void)observeValueForKeyPath:(NSString )keyPath ofObject:(id)object change:(NSDictionary
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: