KVC被称为iOS开发平台的大招!!! 能快速修改对象属性。
//
// XNViewController.m
// KVC----KVO
//
// Created by neng on 14-6-21.
// Copyright (c) 2014年 neng. All rights reserved.
//
#import "XNViewController.h"
#import "XNPerson.h"
#import "XNStudent.h"
#import "XNBook.h"
@interface XNViewController ()
@end
/**
* KVC: Key Value Coding(键值编码)
* 间接修改/获取对象的属性, 降低类与类之间的耦合度.
* KVO: Key Value Observer(键值观察)
KVO通常用于观察”对象的某个属性“发生变化时,及时做出响应!
而NSNotificationCenter是需要POST"通知字符串"(表示监听的事件类型)的对象存在,通知中心才能够工作!
*/
@implementation XNViewController
- (void)viewDidLoad {
[super viewDidLoad];
//1.简单的修改对象属性
[self kvcDemo1];
//2.对于子类, 也能直接修改
[self kvcDemo2];
//3.修改对象的book属性. (相当麻烦, 好要创建book对象).KVC一句话
[self kvcDemo3];
//4.获取对象的属性值. 可批量获取(如果是数组的话).
[self kvcDemo4];
//KVO 演示
[self kvoDemo];
}
- (void)kvoDemo {
XNStudent *stu = [[XNStudent alloc] init];
stu.name = @"xuneng";
//设置监听对象
//1》 负责观察的对象 self
//2》 观察的键值路径
//3》 观察的选项
//4》 上下文:通常用于区分不同的观察事件
[stu addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:@"myObserver"];
stu.name = @"neng"; //修改
//所有观察者模式的性能都不好, 需要及时移除
[stu removeObserver:self forKeyPath:@"name"];
stu.name = @"xu"; //移除后再次修改
}
/**
当KVO指定的对象键值发生改变时, 会自动调用该方法
name: 观察的键值
object: 观察的对象
change: 修改的字典(新旧数值)
context: 指定观察者时传入的上下文
*/
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
NSLog(@"|-- %@ --|-- %@ --|-- %@ --|-- %@--|", keyPath, object, change, context);
}
/**
*简单的修改对象属性
*/
- (void)kvcDemo1 {
//1.原始的方式. 点语法修改对象属性的值
XNPerson *p1 = [[XNPerson alloc] init];
p1.name = @"xuneng";
p1.age = 24;
// NSLog(@"%@ , %d",p1.name,p1.age);
NSLog(@"KVC1 demo1--> %@", p1); //这样直接调用description方法.
//2.KVC来修改
[p1 setValue:@"xxxx" forKeyPath:@"name"];
[p1 setValue:@"10" forKeyPath:@"age"];
NSLog(@"KVC2 demo1--> %@ , %d", p1.name, p1.age);
}
/**
*对于子类, 也能直接改
*/
- (void)kvcDemo2 {
//1.传统方法
XNStudent *p1 = [[XNStudent alloc] init]; //学生
p1.name = @"student xuneng";
p1.age = 22;
// NSLog(@"%@ , %d",p1.name,p1.age);
NSLog(@"KVC1 demo2--> %@", p1); //这样直接调用description方法.
//2.KVC来修改子类
[p1 setValue:@"xxxx" forKeyPath:@"name"];
[p1 setValue:@"10" forKeyPath:@"age"];
NSLog(@"KVC2 demo2--> %@ , %d", p1.name, p1.age);
}
/**
*修改对象的book属性. (相当麻烦, 好要创建book对象).KVC一句话
*/
- (void)kvcDemo3 {
//1.传统方法
XNStudent *p1 = [[XNStudent alloc] init]; //学生
p1.name = @"student xuneng";
p1.age = 22;
XNBook *myBook = [[XNBook alloc] init];
myBook.bookName = @"iOS";
p1.book = myBook;
NSLog(@"KVC1 demo3--> %@", p1);
//2.KVC的方法
[p1 setValue:@"iPhone" forKeyPath:@"book.bookName"]; //学生里的book,book里的bookName
NSLog(@"KVC2 demo3--> %@", p1);
}
/**
*获取对象的属性值. 可批量获取(如果是数组的话).
*/
- (void)kvcDemo4 {
XNStudent *p1 = [[XNStudent alloc] init]; //学生1
p1.name = @"student1 xuneng";
p1.age = 24;
XNBook *myBook1 = [[XNBook alloc] init];
myBook1.bookName = @"iOS";
p1.book = myBook1;
XNStudent *p2 = [[XNStudent alloc] init]; //学生2
p2.name = @"student2 xuneng";
p2.age = 23;
XNBook *myBook2 = [[XNBook alloc] init];
myBook2.bookName = @"iPhone";
p2.book = myBook2;
NSArray *arr = @[p1, p2];
//1.普通方法获取数组中对象的属性
NSMutableArray *arrBook = [[NSMutableArray alloc] init];
for (XNStudent *stu in arr) {
[arrBook addObject:stu.book.bookName];
}
NSLog(@"KVC1 demo4--> %@", arrBook);
//2.KVC方法来获取数组中对象
NSLog(@"KVC2 demo4--> %@", [arr valueForKeyPath:@"book.bookName"]);
}
@end
原文地址:http://blog.csdn.net/xn4545945/article/details/35991753