IOS之KVC机制(Object-C篇)

开发环境:xcode7

一.KVC概述

  1.KVC是KeyValueCoding的简称,它是一种可以直接通过类属性的名字来作key,再绑定key的值来访问类属性的机制,而不再通过利用@property提供的setter和getter方法来访问;

  2.KVC支持类对象和内建的基本数据类型;

  3.KVC的关键方法定义在NSKeyValueCoding.h文件里,常用的方法:

  修改值:

  - (void)setValue:(nullable id)value forKey:(NSString *)key;

  - (void)setValue:(nullable id)value forKeyPath:(NSString *)keyPath;

  获取值:

  - (nullable id)valueForKey:(NSString *)key;

  - (nullable id)valueForKeyPath:(NSString *)keyPath;

二.演示

  1.新建一个工程

  2.新建一个类Person类

Persion.h里为Person类添加姓名和年龄字段,不用@property处理为属性,提供setter和getter方法

#import <Foundation/Foundation.h>

@interface Person : NSObject {
    NSString *name;
    int age;
}

@end

Person.m默认即可,不做任何添加

#import "Person.h"

@implementation Person

@end

  3.在main.m文件中利用KVC,我们来实现对Person类中name和age实例变量的访问

#import <Foundation/Foundation.h>
#import "Person.h"
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Person *person = [[Person alloc] init];
        [person setValue:@"damon" forKey:@"name"];
        [person setValue:@"20" forKey:@"age"];
        NSString *name = [person valueForKey:@"name"];
        int age = [[person valueForKey:@"age"] intValue];
        NSLog(@"name:%@",name);
        NSLog(@"age:%d",age);
    }
    return 0;
}

  4.新建Pet类,让Person类拥有一个Pet实例

  Pet.h文件

#import <Foundation/Foundation.h>

@interface Pet : NSObject {
    NSString *name;
}

@end

  Pet.m文件默认,不做任何修改

  更新Person.h文件,Person.m文件不做任何修改

#import <Foundation/Foundation.h>
@class Pet;
@interface Person : NSObject {
    NSString *name;
    int age;
    Pet *myPet;
}

@end

  5.在main.m文件中,利用KVC访问myPet的name实例变量

#import <Foundation/Foundation.h>
#import "Person.h"
#import "Pet.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Person *person = [[Person alloc] init];
        [person setValue:@"damon" forKey:@"name"];
        [person setValue:@"20" forKey:@"age"];
        NSString *name = [person valueForKey:@"name"];
        int age = [[person valueForKey:@"age"] intValue];
        NSLog(@"name:%@",name);
        NSLog(@"age:%d",age);
        
        Pet *pet = [[Pet alloc] init];
        [pet setValue:@"旺旺" forKey:@"name"];
        [person setValue:pet forKey:@"myPet"];
        NSString *myPetName = [person valueForKeyPath:@"myPet.name"];
        NSLog(@"myPetName:%@",myPetName);
    }
    return 0;
}

三.总结

  KVC这种比编码方式使用起来非常简单,结合KVO,很适用于当模型数据发生改变时,引发的UI改变的情况。

 

posted @ 2015-09-28 21:11  阿赖耶云  阅读(339)  评论(0编辑  收藏  举报