OC语法--KVC概念及用法

来源:互联网 发布:哪个软件可以看黄子片 编辑:程序博客网 时间:2024/05/22 05:33
KVC
KeyValueCoding
1.键-值编码是一个用于间接访问对象属性的机制,使用该机制不需要调用存取方法和变量实例就可访问对象属性。(直接修改内存中的变量)
2.键-值编码方法在Objective-C非正式协议(类目)NSKeyValueCoding中被声明,默认的实现方法由NSObject提供。
3.键-值编码支持带有对象值的属性,同时也支持纯数值类型和结构。非对象参数和返回类型会被识别并自动封装/解封

设置和访问
键-值编码中的基本调用包括:
valueForKey: 
setValue: forkey:

valueForKeyPath:

setValue: forKeyPath:

 这四个个方法,他们以字符串的形式向对象发送消息,字符串是我们关注属性的关键
[book setValue:name forkey :@“name"];
[book valueForKey:@“name”];
检查是否存在setter,和getter方法,如果不存在,他将在内部查找名为_key或key的实例变量。通过KVC,可以获取不存在getter方法的对象值,无需通过对象指针直接访问。
这里我们需要注意,当我们通过setValue:forKey:设置对象的值,或通过valueForKey来获取对象的值时,如若对象的实例变量为基本数据类型时(char、int、float、BOOL),我们需要对数据进行封装与解封。
实例代码:

Person中具有dog属性,和一组由以书类集合的属性
Person.h文件

@class Dog;

@interface Person :NSObject

@property (nonatomic,copy)NSString *name;

@property (nonatomic,assign)int age;

@property (nonatomic,strong)NSArray *books;

@property (nonatomic,strong)Dog *dog;

- (void)printHeight;

Person.m文件

@implementation Person

{

    @private

   double _height;

}

//_height为私有属性,所以没有get,set方法需要内部访问

- (void)printHeight

{

    NSLog(@"height%f",_height);

}

@end

Dog.h文件

@interface Dog : NSObject

@property (nonatomic,copy)NSString *name;

@end

Book.h文件

@interface Book : NSObject

@property (nonatomic,assign)double price;

@property (nonatomic,copy)NSString *name;

@end


进行下面操作:
进行单层访问是key和keypath作用都可以

Person *p = [[Personalloc]init];

            p.name =@"rose";

            p.age =20;


            [psetValue:@"jack"forKey:@"name"];

            [psetValue:@30forKey:@"age"];


     //利用KVC可以随意修改一个对象的属性或者成员变量(并且私有的也可以修改)

            [psetValue:@"jack"forKeyPath:@"_name"];

            [psetValue:@30forKeyPath:@"_age"];

           NSLog(@"%d %@", p.age, p.name);

    //访问他的私有成员变量

    [p setValue:@10.5forKey:@"height"];

    [p printHeight];



但是进行多层次访问时只能用keypath

Person *p = [[Personalloc]init];

    p.dog = [[Dogalloc]init];

            p.dog.name =@"wangwang";

            [p.dog setValue:@"taidi" forKey:@"name"];

            [p.dog setValue:@"zangao" forKeyPath:@"name"];

  //人调用setvlaue给狗赋值

            [p setValue:@"hashiqi"forKeyPath:@"dog.name"];


可以直接提取数组中的属性,的子属性的属性变量,组成新的数组

  Person *p = [[Personalloc]init];

       Book *book1 = [[Bookalloc]init];

        book1.name =@"java程序设计";

        book1.price =10.5;

        

       Book *book2 = [[Bookalloc]init];

        book2.name =@"IOS程序设计";

        book2.price =18.5;

        

       Book *book3 = [[Bookalloc]init];

        book3.name =@"鸟语程序设计";

        book3.price =20.5;


        p.books =@[book1, book2, book3, book4];

// 取出books数组中每一个元素的name属性值,放到一个新的数组中返回

      NSArray *names = [pvalueForKeyPath:@"books.name"];

//还有计算和平局值等等函数。其他可以百度

       NSNumber *avgNumber = [pvalueForKeyPath:@"books.@avg.price"];

       NSNumber *sumNumber = [pvalueForKeyPath:@"books.@sum.price"];








0 0