• iOS_KVC与KVO


    目  录:
    一、KVC  
    二、KVO                                                                                                                                                                                              
    一、KVC机制                                                                                                                                                            
      1、KVC简述
      KVC是KeyValueCoding(键值对的编码)的简称,它是一种可以直接通过字符串的名字(key)来访问类属性(实例变量)的机制。而不是通过调用Setter、Getter方法访问。KVO 就是基于 KVC 实现的关键技术之一。
      2,使用方法
      关键方法定义在:NSKeyValueCodingprotocol。
      KVC支持类对象和内建基本数据类型。
      KVC的常用方法:
        - (id)valueForKey:(NSString *)key;//获取
        -(void)setValue:(id)value forKey:(NSString *)key;//设置
      valueForKey的方法根据key的值读取对象的属性,setValue:forKey:是根据key的值来写对象的属性。
      例如:
        [person setValue:@“Tom” forKey:@“name”];
        NSString *name = [person valueForKey:@“name”];
    #import <Foundation/Foundation.h>
    
    @interface Person : NSObject
    {
        NSString *_name;
        NSInteger _age;
        Person *_wife;
    }
    @end
    #import "ViewController.h"
    #import "Person.h"
    @interface ViewController ()
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        //创建对象
        Person *person = [[Person alloc]init];
        //使用KVC来存储对象的数据成员
        [person setValue:@"Tom" forKey:@"_name"];
        [person setValue:@25 forKey:@"_age"];
        NSLog(@"person:%@",person);
        //取对象的数据成员
        NSString *name = [person valueForKey:@"_name"];
        NSInteger age = [[person valueForKey:@"_age"]integerValue];
        NSLog(@"KVC方式存取:name:%@,age:%ld",name,age);
        
    }
    @end

      如果需要打印输出对象,还需要重写Person类的descaprition方法。

    #import "Person.h"
    
    @implementation Person
    -(NSString *)description
    {
        return [NSString stringWithFormat:@"name:%@,age:%ld",_name,_age];
    }
    @end

      3、扩展KVC的使用

    Book类的.h文件
    
    #import <Foundation/Foundation.h>
    
    @interface Book : NSObject
    @property(copy,nonatomic)NSString *bookName;
    
    @end
    
    Book类的.m文件
    #import "Book.h"
    
    @implementation Book
    -(NSString *)description
    {
        return [NSString stringWithFormat:@"%@",_bookName];
    }
    @end
    Person类的.h文件
    
    #import <Foundation/Foundation.h>
    @class Book;
    @interface Person : NSObject
    @property(copy,nonatomic)NSString *name;
    @property(assign,nonatomic)NSInteger age;
    @property(strong,nonatomic)Book *book;
    @end
    
    
    Person类的.m文件
    #import "Person.h"
    
    @implementation Person
    -(NSString *)description
    {
        return [NSString stringWithFormat:@"name:%@,age:%ld",_name,_age];
    }
    @end

      最后是实现文件。

    #import "ViewController.h"
    #import "Book.h"
    #import "Person.h"
    @interface ViewController ()
    
    @end
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        Person *p1 = [[Person alloc]init];
        [p1 setValue:@"Tom" forKey:@"name"];
        [p1 setValue:@23 forKey:@"age"];
        Book *book1 = [[Book alloc]init];
        book1.bookName = @"iPhone";
        p1.book = book1;
        
        Person *p2 = [[Person alloc]init];
        [p2 setValue:@"Jerry" forKey:@"name"];
        [p2 setValue:@23 forKey:@"age"];
        Book *book2 = [[Book alloc]init];
        book2.bookName = @"iOS";
        p2.book = book2;
        
        NSLog(@"%@%@",p1,[p2 valueForKeyPath:@"name"]);
        
        NSArray *person = @[p1,p2];
        NSLog(@"%@",person);
        
        NSArray *arrayM = [person valueForKeyPath:@"book.bookName"];
        NSLog(@"%@",arrayM);
    }
    
    @end
     
    二、KVO机制                                                                                                                                                                                                
      1、KVO简述
      KVO,即:Key-Value Observing,它提供一种机制,当指定的对象的属性被修改后,则对象就会接受到通知。简单的说就是每次指定的被观察的对象的属性被修改后,KVO就会自动通知相应的观察者了。
      2、使用方法
      系统框架已经支持KVO,所以程序员在使用的时候非常简单。使用步骤:
       (1)注册需要观察的对象的属性addObserver:forKeyPath:options:context:
       (2)实现observeValueForKeyPath:ofObject:change:context:方法,这个方法当观察的属性变化时会自动调用
       (3)取消注册观察removeObserver:forKeyPath:context:
    #import <Foundation/Foundation.h>
    
    @interface Person : NSObject
    {
        NSString *_name;
    }
    @end
    #import "Person.h"
    
    @implementation Person
    //接受被观察者发生变动后的通知
    -(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
    {
        NSLog(@"%@,%@,%@,%@",keyPath,object,change,context);
    }
    @end

      再添加一个股票类,让Person作为观察者,对股票的价格进行监听。

    #import <Foundation/Foundation.h>
    
    @interface Stock : NSObject
    {
        NSString *_name;
        float _price;
    }
    @end

      实现文件内容:

    #import "ViewController.h"
    #import "Person.h"
    #import "Stock.h"
    @interface ViewController ()
    @property(strong,nonatomic)Person *person;
    @property(strong,nonatomic)Stock *stock;
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        //创建观察者
        self.person = [[Person alloc]init];
        [self.person setValue:@"Tom" forKey:@"_name"];
    
        //创建股票
        self.stock = [[Stock alloc]init];
        [self.stock setValue:@"sxt" forKey:@"_name"];
        [self.stock setValue:@1.2 forKey:@"_price"];
        
        //设置观察者
        [self.stock addObserver:self.person forKeyPath:@"_price" options:NSKeyValueObservingOptionNew |NSKeyValueObservingOptionOld context:@"add"];
    }
    //单击按钮让股票价格加1
    - (IBAction)buttonClicked:(UIButton *)sender
    {
        float price = [[self.stock valueForKey:@"_price"]floatValue];
        [self.stock setValue:@(price+1.0) forKey:@"_price"];
    }
    
    -(void)dealloc
    {
        //删除观察者
        [self.stock removeObserver:self.person forKeyPath:@"_price"];
    }
    @end
  • 相关阅读:
    编程题#2: 魔兽世界之二:装备
    程序设计实习MOOC / 继承和派生——编程作业 第五周程序填空题1
    【转】C++动态创建二维数组,二维数组指针
    HDU-2571命运
    HDU-1203 I NEED A OFFER!
    HDU-1003 Max Sum
    HDU2196-Computer
    HDU-1520 Anniversary party
    ChineseHelper(获取汉字字符串的首拼)
    车牌号正则表达式(新能源车牌)
  • 原文地址:https://www.cnblogs.com/xjf125/p/4878750.html
Copyright © 2020-2023  润新知