【OC学习-31】利用KVC即键值编码来访问一些对象的属性,尽管这些属性是私有的

最简单的想法是我们创建一个对象,然后利用某些方法给这个对象赋值,然后再用某些方法调用这个值。当然这种描述很类似于字典的键值概念,确实今天学习的就是这样一种方法:KVC,Key-Value coding键值编码。

(1)简单的KVC

创建一个Book类,在Book.h里写一个私有的实例变量name,然后再main.m里创建一个book1对象,再给这个book1对象的私有变量name赋值,然后再调用这个值。神奇的地方就在这里:这种方法根本不管这个实力变量是private还是public。呃,Book.m里没有写入任何东西。

//Book.h文件
#import <Foundation/Foundation.h>
@interface Book : NSObject{
    @private
    NSString *name;
}
@end
//main.m文件
#import <Foundation/Foundation.h>
#import "Book.h"

int main(int argc, const char * argv[])
{
    @autoreleasepool {
        Book * book1=[[Book alloc]init];
        //给对象的实例变量赋值,用setValue,核心是这里的key要么是实例变量同名,要么在前面加一个下划线_,否则报错
        [book1 setValue:@"jack" forKey:@"name"];
        //调用时候的key同上,要么是实例变量同名,要么加下划线_
        NSString *name1=[book1 valueForKey:@"name"];
        NSLog(@"%@",name1);
    }
    return 0;
}

结果当然是jack。

提示:

a:设定的key要么与实例变量同名,要么前面加_,因为程序运行时会去类中找,先找同名的,再找带有下划线_的,找不到就报错。

b:我们用NSString *name来做实例变量,name是一个字符串对象,没问题。但不能用直接的数据类型,需要对数据类型进行封装成数据对象NSNumber。

c:采用这种方法可以说十分强大,就算实例变量没有setter和getter方法,依然没问题。

d:缺点在于,采用这种方法编写的时候不会报错,在运行的时候会直接崩溃。

(2)复杂一些的带有路径链条访问的例子

创建一个Author类,只有一个私有变量aName,并且在Book类中引入这个对象作为对象变量author。这样Book类的对象就可以通过访问自身的author对象,再访问author对象的aName,实现依靠路径的访问。

//Author.h文件
#import <Foundation/Foundation.h>
@interface Author : NSObject{
    @private
    NSString *aName;
}
@end
//Book.h文件
#import <Foundation/Foundation.h>
#import "Author.h"//别忘了引入这个类
@interface Book : NSObject{
    @private
    NSString *name;
    Author *author;//增加一个对象变量
}
@end
//main.m文件
#import <Foundation/Foundation.h>
#import "Book.h"

int main(int argc, const char * argv[])
{
    @autoreleasepool {
        Book * book1=[[Book alloc]init];
        Author *author1=[[Author alloc]init];
        //把author对象当做值赋给book1里地对象变量,把jack赋值给author对象里面的aName
        [author1 setValue:@"jack" forKey:@"aName"];
        [book1 setValue:author1 forKey:@"author"];
        //通过路径调用,book1的author的aName
        NSString *aName1=[book1 valueForKeyPath:@"author.aName"];
        NSLog(@"%@",aName1);
    }
    return 0;
}

结果当然是jack。

(3)一对多的访问

就是一个数组里面装3个对象,每个对象有一对键值,但是三个对象的键相同,所以我们访问的时候,满足条件的键对应的值都会被调出来。

 NSArray *relativeBooks;//在Book.h里增加数组变量
//main.m文件
#import <Foundation/Foundation.h>
#import "Book.h"

int main(int argc, const char * argv[])
{
    @autoreleasepool {
        //创建一个数组
        NSMutableArray *mutArr1=[NSMutableArray arrayWithCapacity:3];
        //往数组里面填充三个对象,三个对象有在相同的键名就是name
        for (int i=0; i<3; i++) {
            Book *book1=[[Book alloc]init];
            NSString *name1=[NSString stringWithFormat:@"book_%d",i];
            [book1 setValue:name1 forKey:@"name"];
            [mutArr1 addObject:book1];
        }
        //再创建一个新对象,把这个数组赋值给这个对象的数组变量
        Book * book2=[[Book alloc]init];
        [book2 setValue:mutArr1 forKey:@"relativeBooks"];
        //然后再来通过路径访问,而且访问数据里面的键时会把满足条件的都调出来组成新的数组返回
        NSArray *arr2=[book2 valueForKeyPath:@"relativeBooks.name"];
        NSLog(@"%@",arr2);
    }
    return 0;
}

结果:

(
    "book_0",
    "book_1",
    "book_2"
)

其实,针对上面的还可以进行简单地运算:即如果上面数组要访问的不是书名,而是价格price,那么可以在访问的同时做一些求和、最大、最小的运算。修改如下:

a:在Book.h中继续增加一个float price的实例变量;

b:在循环语句赋值中[book1 setValue:@(12+i)
forKey:@"price"];记得在数字前面加@,要把它们变成对象才可以;

c:在最后调用的时候,用NSNUmber *num=[book2
valueForKeyPath:@"[email protected]"];其中@sum就是加入的运算,也可以是@min和@max和@avg等。

时间: 2024-11-05 11:51:51

【OC学习-31】利用KVC即键值编码来访问一些对象的属性,尽管这些属性是私有的的相关文章

iOS学习笔记(6)键值编码——KVC

在KVC编程方式中,无论调用setValue:forKey:方法,还是调用valueForKey:方法,都是通过NSString对象来指定被操作属性,其中forKey:标签用户传入属性名的. 对于setValue:属性值[email protected]“name”;代码,底层的执行机制如下. (1)程序优先考虑调用“setName:属性值;”代码通过setter方法完成设置. (2)如果该类没有setName:方法,KVC机制会搜索该类名为_name的成员变量,无论该成员变量是在类接口部分定义

OC8-属性 KVC是键值编码

1.属性,是oc提供的一种快速的模式化的创建实例变量的方式. (1)属性是通过@property标记的, (2)属性会在背后,默默的帮我们做set和get方法 2.属性做的工作 (1)创建一个实例变量,名字是下划线加属性名, (2)帮我们自动get和setter 的方式,创建一组方法, 3.点语法,点语法是专门为了setter 和getter 方法配备的一种语法糖.会自动根据语法和语境调用是哪一种方法, (1) (.)其实就是转换成了getter 和setter 方法,p.hobby.lengt

IOS开发之旅-KVC【键值编码】

在日常开发中,读取修改对象的属性值时,通常是点调用对应的属性进行相关操作.另外一种方式是通过键值编码,简称KVC,在键值编码中主要使用以下方法 /* Given a key that identifies an attribute or to-one relationship, return the attribute value or the related object. Given a key that identifies a to-many relationship, return a

KVC(键值编码)(二十五)

kvc的英文全称是key-value-coding,意思就是键值对编码.用普通的话来说,就是kvc就是通过使用键(字符串)来取值的一种编码.是一种间接访问对象属性的机制,不需要调用getter.setter这些存取方法,就可以直接访问对象属性. 我们声明的变量,有可见度.有些私有的,或者受保护的变量,在其他类中,不能直接使用.我们可以通过kvc,用对象在类外部对实例变量进行访问和赋值.不论是什么可见度的实例变量(private,protected,public). setValue: forKe

kvc(键-值编码)

{ NSString *_name; Author *_author; NSArray *_kvcArray; float price;} //kvc,setValue 的设的值是 “要设置的值” forKey 设置的是对象的属性,如果不是的话要将其转化对象(int folat,char,double) Book *book = [[Book alloc] init]; //        Author *author = [[Author alloc] init]; //        [au

ios中键值编码kvc和键值监听kvo的特性及详解

总结: kvc键值编码  1.就是在oc中可以对属性进行动态读写(以往都是自己赋值属性)           2. 如果方法属性的关键字和需要数据中的关键字相同的话                  3. 动态设置:setValue:属性值 forKey:属性名(用于简单的路径)/setValue:属性值 forKeyPath:属性名(用于复杂的路径)kvo键值监听  永久性的监听item属性值的改变,如果改变就从新设置             1.监听方法:[addObserver:self

(转载)OC学习篇之---KVC和KVO操作

前一篇文章我们介绍了OC中最常用的文件操作,那么今天来看一下OC中的一个比较有特色的知识点:KVC和KVO 一.KVC操作 OC中的KVC操作就和Java中使用反射机制去访问类的private权限的变量,很暴力的,这样做就会破坏类的封装性,本来类中的的private权限就是不希望外界去访问的,但是我们这样去操作,就会反其道而行,但是我们有时候真的需要去这样做,哎.所以说有些事不是都是顺其自然的,而是需要的时候自然就诞生了. 下面就来看一下这种技术的使用: Dog.h 1 // 2 // Dog.

OC学习篇之---KVC和KVO操作

前一篇文章我们介绍了OC中最常用的文件操作:http://blog.csdn.net/jiangwei0910410003/article/details/41875015,那么今天来看一下OC中的一个比较有特色的知识点:KVC和KVO 一.KVC操作 OC中的KVC操作就和Java中使用反射机制去访问类的private权限的变量,很暴力的,这样做就会破坏类的封装性,本来类中的的private权限就是不希望外界去访问的,但是我们这样去操作,就会反其道而行,但是我们有时候真的需要去这样做,哎.所以

Objective-C(十七、KVC键值编码及实例说明)——iOS开发基础

结合之前的学习笔记以及参考<Objective-C编程全解(第三版)>,对Objective-C知识点进行梳理总结.知识点一直在变,只是作为参考,以苹果官方文档为准~ 十七.键值编码 KVC 关于KVC的知识点将通过下列例子来展开说明: Person.h文件,Person类拥有name和age两个成员变量 @interface Person : NSObject { @private NSString *_name; NSInteger _age; } - (void)setAge:(NSIn