您的位置:首页 > 其它

OC学习篇之-----KVC

2015-12-24 17:38 246 查看
设计模式 – 观察者模式

设计模式是用来解决某些特定问题的

观察者模式

什么是观察者模式?

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

什么时候使用观察者模式?
在工程中,一些类去观察A类,当’A类‘发生变化时,这些观察类就会收到消息,和作出相应的反应。

观察者模式的作用?
一对多的发送消息。
如何在OC中实现观察者模式呢?
OC中观察者模式的设计基础:'KVC/KVO',
KVC 的由来,在ios2.0之前,并没有属性来访问类中的实例变量,那时候开发人员使用'键值编码'的方式来访问类的实例变量,即是‘KCV’方式。

KVC(key-Value Coding)键值编码
通过制定表示要访问的属性的名字的字符串标识符,可以进行类的属性读取和设置。KVC提供了一种在运行时而非编译时动态访问对象属性于实例变量的方式


直接看代码

一个书本类:

#import <Foundation/Foundation.h>

@interface Book : NSObject
@property(nonatomic,assign)NSString *name;

@end


一个学生类:.h,里面有一个属性是BOOK类型

#import <Foundation/Foundation.h>
#import "Book.h"
@interface Student : NSObject

@property(nonatomic,assign)Book *book;
@property(nonatomic,copy)NSString *name;

@end


主文件中:

#import "ViewController.h"
#import "Book.h"
#import "Student.h"
@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
[super viewDidLoad];

Book *book = [Book new];
Student *stu = [Student new];
[stu setValue:@"小明" forKey:@"name"];
//通过键,或键路经来赋值和取值
[stu setValue:book forKeyPath:@"book"];
[stu setValue:@"语文" forKeyPath:@"book.name"];
NSLog(@"%@,%@",[stu valueForKey:@"name"],[stu valueForKeyPath:@"book.name"]);

}


总结:这就是KVC了,通过键,或键路经来赋值和取值。

另:KVC作用挺强大的例如可以用于运行时动态取值,如下:


//动态访问某些属性
//试用KVC动态访问某些属性,使用一些可以在运行时而不是编译时改变的值 的例子
stu1.p1 = 1;
stu1.p2 = 2;
stu1.p3 = 3;
//传统方法
int num = [stu1 getValuePropertyName:@"p1"];
NSLog( @"num = %d",num);

//动态访问
int num1 = [stu1 getValuePropertyNewName:@"p2"];
NSLog( @"num1 = %d",num1);


以下是两个方法的实现代码:

//传统的代码实现
-(int)getValuePropertyName:(NSString *)pName{

if ([pName isEqualToString:@"p1"]) {
return self.p1;
}else if ([pName isEqualToString:@"p2"]){
return self.p2;
}else if ([pName isEqualToString:@"p3"]){
return self.p3;
}
return 0;
}
//KVC的代码实现
-(int)getValuePropertyNewName:(NSString *)pName{
NSNumber *pNumber = [self valueForKey:pName];
int number = [pNumber intValue];
return number;
}


总结:这种情况下,没增加一个变量,传统的方法就要加多一个if语句,而用了KVC得就不用!优势显而易见!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: