黑马程序员—OC基础--初探 “KVC”
2015-05-26 15:04
155 查看
------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! ———
/******************************************
* 今天对 “KVC(键值编码)”进行学习.收获如下:
* KVC是一种对对象属性更灵活的操作方式,这种方式以字符串为Key来间接操作对象的属性
* 1. 最基本的KVC是由NSKeyValueCoding协议提供支持操作属性的两个方法:
*
1⃣️存:“setValue:属性值对象 forKey:属性名字符串”
*
2⃣️取:“valueForKey:属性名字符串”
*
* 2. 执行机制:
* __
* | 1.程序首先寻找setter和getter方法,如找到则使用setter或getter
* | 2.如果没有setter或getter,则寻找名为_name的成员变量,直接取值或赋值
* < 3.如果没有名位_name的成员变量,则寻找名为name的成员变量,直接取值或赋值
* | 4.如果以上三条都没有找到,系统将会执行该对象的 “setValue:forUndefinedKey:”或“valueUndefinedKey:”方法
* |__ (两种方法实现的就是引发异常,致程序异常结束)
*
* 3. 如果前三条都没找到,系统默认的异常处理方法不合适(如并不想让程序结束),
* 可以覆写“setValue:forUndefinedKey:”和“valueUndefinedKey:”方法
*
* 4. 基本类型不可以赋值为nil,使用KVC也会默认使用setNilValueForKey:方法将程序异常结束;如不合适,可覆写。
*
* 5. KVC还可以操作“对象所包含的对象属性”(即复合属性),KVC机制将其称为Key路径。使用如下两个方法:
*
1⃣️存:setValue:属性值对象 forKeyPath:Key路径
*
2⃣️取:valueForKeyPath:Key路径
*
*******************************************/
代码实现:
/******************************************
* 今天对 “KVC(键值编码)”进行学习.收获如下:
* KVC是一种对对象属性更灵活的操作方式,这种方式以字符串为Key来间接操作对象的属性
* 1. 最基本的KVC是由NSKeyValueCoding协议提供支持操作属性的两个方法:
*
1⃣️存:“setValue:属性值对象 forKey:属性名字符串”
*
2⃣️取:“valueForKey:属性名字符串”
*
* 2. 执行机制:
* __
* | 1.程序首先寻找setter和getter方法,如找到则使用setter或getter
* | 2.如果没有setter或getter,则寻找名为_name的成员变量,直接取值或赋值
* < 3.如果没有名位_name的成员变量,则寻找名为name的成员变量,直接取值或赋值
* | 4.如果以上三条都没有找到,系统将会执行该对象的 “setValue:forUndefinedKey:”或“valueUndefinedKey:”方法
* |__ (两种方法实现的就是引发异常,致程序异常结束)
*
* 3. 如果前三条都没找到,系统默认的异常处理方法不合适(如并不想让程序结束),
* 可以覆写“setValue:forUndefinedKey:”和“valueUndefinedKey:”方法
*
* 4. 基本类型不可以赋值为nil,使用KVC也会默认使用setNilValueForKey:方法将程序异常结束;如不合适,可覆写。
*
* 5. KVC还可以操作“对象所包含的对象属性”(即复合属性),KVC机制将其称为Key路径。使用如下两个方法:
*
1⃣️存:setValue:属性值对象 forKeyPath:Key路径
*
2⃣️取:valueForKeyPath:Key路径
*
*******************************************/
代码实现:
#import <Foundation/Foundation.h> /****************** LBXYApple类 **********************/ @interface LBXYApple : NSObject { @package NSString* name; NSString* _name; } @end @implementation LBXYApple { double price; } - (void)setValue:(id)value forUndefinedKey:(NSString *)key { NSLog(@"您尝试设置的Key:%@ 并不存在!您尝试设置的value为:%@.",key,value); } @end /*************************v************************/ /****************** LBXYAppleTree类 **********************/ @interface LBXYAppleTree : NSObject @property(nonatomic, strong) LBXYApple* app; @end @implementation LBXYAppleTree @end /*********************************************************/ int main(int argc, const char * argv[]) { @autoreleasepool { LBXYApple* apple = [[LBXYApple alloc] init]; [apple setValue:@"大苹果" forKey:@"name"]; //由于KVC默认机制,没有setter方法,会将@“大苹果”赋值给_name成员变量。 NSLog(@"apple的name是:%@",apple->name); //初始化后为nil,所以仍为nil NSLog(@"apple的_name是:%@",apple->_name); //使用KVC对_name赋值为@“大苹果” [apple setValue:[NSNumber numberWithDouble:5.2] forKey:@"price"]; NSLog(@"apple的price为: %@ 元/500g",[apple valueForKey:@"price"]); [apple setValue:@"ABC" forUndefinedKey:@"age"]; //向不存在的属性发送KVC赋值消息,触发覆写的setValue:forUndefinedKey:方法. LBXYAppleTree* tree = [[LBXYAppleTree alloc] init]; tree.app = [[LBXYApple alloc] init]; //初始化tree对象包含的app对象 [tree setValue:@"我是苹果数上的一颗苹果" forKeyPath:@"app.name"]; //使用Key路径为“tree对象包含的app对象的name属性”赋值 NSLog(@"苹果树上有颗苹果名字叫:%@",[tree valueForKeyPath:@"app.name"]);//使用Key路径对“tree对象包含的app对象的name属性”取值 } return 0; }
相关文章推荐
- 黑马程序员—OC基础--初探 “KVO”
- 黑马程序员—OC基础--初探“多态”
- 黑马程序员——OC基础——类的三大特性(2)
- OC基础之KVC,KVO
- 黑马程序员——OC基础——category、description和SEL
- 黑马程序员——ios开发基础之OC中Foundation框架(二)、copy以及单例
- 黑马程序员---学习笔记19:OC基础(6)
- OC基础:属性.点语法.KVC 分类: ios学习 OC 2015-06-24 17:24 61人阅读 评论(0) 收藏
- (七)黑马程序员——oc基础之继承与重写构造方法
- 黑马程序员——IOS基础---Objective-C第一节课---最简单的OC程序
- 黑马程序员——OC基础:了解OC和基础语法
- 黑马程序员——OC基础:block和Protocol及Category
- 黑马程序员---OC基础---封装、继承、多态、@property、id类型、实例变量修饰符
- 黑马程序员 OC基础: 常用语法
- 黑马程序员——OC基础之NSMutableString
- 黑马程序员—OC语言基础—内存管理
- 黑马程序员--IOS基础第十六天(OC)
- 黑马程序员-OC语言基础:block
- 黑马程序员__oc基础知识总结
- 黑马程序员-OC语言基础学习(三)