OC学习篇之-----KVC
2015-12-24 17:38
246 查看
设计模式 – 观察者模式
设计模式是用来解决某些特定问题的
观察者模式
什么是观察者模式?
当一个类需要发送消息给多个类的时候,就用观察者模式
直接看代码
一个书本类:
一个学生类:.h,里面有一个属性是BOOK类型
主文件中:
以下是两个方法的实现代码:
总结:这种情况下,没增加一个变量,传统的方法就要加多一个if语句,而用了KVC得就不用!优势显而易见!
设计模式是用来解决某些特定问题的
观察者模式
什么是观察者模式?
当一个类需要发送消息给多个类的时候,就用观察者模式
什么时候使用观察者模式? 在工程中,一些类去观察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得就不用!优势显而易见!
相关文章推荐
- Swift主题色顶级解决方案
- [css]我要用css画幅画(七) - 哆啦A梦
- Python的数据类型
- android zxing自定义界面,点击按钮开关闪光灯
- MFC与C#连接MYSQL乱码问题
- Servlet 实现下载功能
- js封装时间转换工具,实现日期之前的转换
- 技术人员如何去面试?
- 接口学习
- test
- C++科学计算库GSL在Windows下的配置
- Perceptron Learning Algorithm(python实现)
- ASP.NET 对象的使用,深化
- JSP转发和重定向的区别
- 翻译:Linux的电源管理架构
- 用原生js实现数据双向绑定
- 解决Android Studio的ADB not responding错误
- 一个设置多个类似标志的好办法 iOS 类似flag
- Android 广播、EventBus、观察者模式
- Git 分支管理策略