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  






  • 相关阅读:
    AtCoder Regular Contest 093
    AtCoder Regular Contest 094
    G. Gangsters in Central City
    HGOI 20190711 题解
    HGOI20190710 题解
    HGOI 20190709 题解
    HGOI 20190708 题解
    HGOI20190707 题解
    HGOI20190706 题解
    HGOI 20190705 题解
  • 原文地址:https://www.cnblogs.com/mthoutai/p/6857232.html
Copyright © 2011-2022 走看看