zoukankan      html  css  js  c++  java
  • 【iOS】KVC 与 KVO

    一、KVC与KVO

    *KVC”:key value Coding(键值编码)
    *目的:间接改动或获取对象的属性,减少程序(类与类)之间的耦合度.

    *KVO”:key value Observer(键值观察),观察者模式.(检測模型变化用的多)
    *目的:通经常使用于观察某个对象的某个属性发生变化,及时做出对应.

    二、KVC的使用方式

    KVC被称为iOS开发平台的大招!!! 能高速改动对象属性。

    *[p1setValue:@“xxxx”forKeyPath:@“name”];改动指定对象属性.
    *[arrvalueForKeyPath:@“book.bookName”];  获取对象属性.
    *KVC通过键能直接取得数组.
    *在使用KVC, 一定要保证键值是存在.
    *原理KVC取值时, 假设发现取值的对象不包括指定的键值,会自己主动进入对象内部成员进行查找.

    三、KVO的使用方式

    *KVO通经常使用于观察对象某个属性发生变化时,做出对应的反应.(多用于观察模型数据)
    *KVO和通知中心的一个差别 : KVO仅仅能盯着某个对象(在当前区域内部工作),通知中心能够穿越非常多层(如viewController).
    *KVO使用步骤:
    *1.[stuaddObserver:selfforKeyPath:@"name" options:NSKeyValueObservingOptionNew |NSKeyValueObservingOptionOld context:@"myObserver"];
    *2.observeValueForKeyPath.  当指定键值发生改变时, 会自己主动调用这种方法
    *3.removeObserver. 全部观察者模式的性能都不好,须要及时移除。

    直接上代码:
    //
    //  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://download.csdn.net/detail/xn4545945/7571719

    转载请注明出处:http://blog.csdn.net/xn4545945  






  • 相关阅读:
    我是如何学习和工作的(1)
    SQL server事物复制报错:要复制的 LOB 数据的长度(xxxxx)超出了配置的最大值 65536
    SQL Server2012高可用之事物复制(发布订阅)测试
    MySQL参数学习(一)
    Oracle间隔(interval)分区
    oracle异机恢复测试
    使用awrsqrpt.sql查看执行计划demo
    使用10046追踪执行计划demo
    js中call、apply和bind到底有什么区别?
    为什么0.1+0.2=0.30000000000000004
  • 原文地址:https://www.cnblogs.com/mthoutai/p/6857232.html
Copyright © 2011-2022 走看看