iOS KVC详解
2015-09-06 21:52
375 查看
What is KVC
KVC 即 key-value coding,是一种间接访问对象属性的机制。这种机制是使用strings 来识别属性,而不是通过调用访问器方法或者是直接访问实例变量。很多时候在应用中使用KVC,可以简化编程。KVC Fundamental
Keys 和 Key Paths的区别
Key是一个识别对象属性的字符串,一般与接收者对象的访问器方法名和实例变量名一致。Key必须实用 ASCII编码,小写字母开头,并且不能包含空格。例如buyer,amount,openingSource。Key path是用点隔开的key的字符串,如address.street,先得到接收者对象的address属性,再判定address对象的street属性。
取值
KVC可以用来访问三种不同类型的对象的值:attributes,to-one relationships, to-many relationships.attribute 指简单值的属性,如标量(质量、密度)、字符串,布尔值。 Value 对象如NSNumber 和其它一些可变类如NSColor也被认为是attrubutes。
to-one relationship 的property:一对一关系的属性, 如NSView 实例的superview。
to-many relationship:一对多关系的属性:由一个相关对象的集合组成 ,如一个NSArray或NSSet通常持有这样一个集合 。
例如新建Person,Dog,Book类,在Person类中:
#import <Foundation/Foundation.h> #import "Dog.h" @interface Person : NSObject{ @private int _height; } @property (nonatomic,copy) NSString *name; //attribute @property (nonatomic,assign) NSInteger age; //attribute @property (nonatomic,retain) Dog *dog; //to-one relationship @property (nonatomic,retain) NSArray *books;//to-many relationship - (void)printInfo; @end
Book类:
#import <Foundation/Foundation.h> @interface Book : NSObject @property (nonatomic,copy) NSString *name; @property (nonatomic,assign)float price; @end
使用:
NSArray *books = @[b1,b2];//只能创建不可改变的数组 p1.books = books; [p1.books enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { Book *tmp = (Book *)obj; NSLog(@"%@",tmp.name); }];//枚举方式遍历取值 //KVC方式 NSArray *book_names = [p1 valueForKeyPath:@"books.name"]; NSLog(@"KVCbook列表%@",book_names); //可使用KVC提供的@avg,@count,@max,@min,@sum NSNumber *totalPrice = [p1 valueForKeyPath:@"books.@sum.price"]; NSLog(@"%@",totalPrice); NSNumber *avgPrice = [p1 valueForKeyPath:@"books.@avg.price"]; NSLog(@"%@",avgPrice);
改值
//根据之前提到过的,再次体悟forKey 与 forKeyPath的差异 p1.dog = d; p1.name = @"Kerry"; [p1 setValue:@99 forKeyPath:@"height"]; d.name = @"dog"; NSLog(@"%@",p1.dog.name); [p1 setValue:@"dog1" forKeyPath:@"dog.name"]; NSLog(@"%@",p1.dog.name); [p1 setValue:@"dog2" forKey:@"dog.name"];//这是不可以的 /** *当对象又引用其它对象的时候,直接给其他对象赋值必须用forKeyPath **/ [p1.dog setValue:@"dog2" forKey:@"name" ]; NSLog(@"%@",p1.dog.name); /** *用KVC取值 **/ // NSLog(@"%@",[p1 valueForKey:@"dog.name"]); NSLog(@"%@",[p1 valueForKeyPath:@"dog.name"]); NSLog(@"%@",[p1.dog valueForKeyPath:@"name"]);
相关文章推荐
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 不可修补的 iOS 漏洞可能导致 iPhone 4s 到 iPhone X 永久越狱
- iOS 12.4 系统遭黑客破解,漏洞危及数百万用户
- 每日安全资讯:NSO,一家专业入侵 iPhone 的神秘公司
- [转][源代码]Comex公布JailbreakMe 3.0源代码
- js判断客户端是iOS还是Android等移动终端的方法
- IOS开发环境windows化攻略
- .net平台推送ios消息的实现方法
- 探讨Android与iOS,我们将何去何从?
- Android、iOS和Windows Phone中的推送技术详解
- IOS 改变键盘颜色代码
- Android和IOS的浏览器中检测是否安装某个客户端的方法
- javascript实现阻止iOS APP中的链接打开Safari浏览器
- IOS开发第三方语音-微信语音
- iOS开发之路--微博OAuth授权_取得用户授权的accessToken
- ios通过按钮点击异步加载图片
- 加载带有手势识别器的XIB文件需注意哪些问题
- 仅需几行代码实现方便易用的状态栏指示器