Objective-C ,KVC研究,几种属性赋值的方法
来源:互联网 发布:java框架是什么 编辑:程序博客网 时间:2024/06/04 19:24
第一篇博文,分享一下自己对KVC的理解
系统的KVC通常情况下是用来批量赋值的,使用形如
[obj setValuesForKeysWithDictionary:dict];进行整体赋值,或者使用
[obj setValue:@"Tom" forKey:@"name"];形式进行指定成员变量的赋值。
看一些情况:
@implementation Car{ @private //用private申明一个成员变量,写在@implementation中 NSString *_name;}- (NSString *)description{ return [NSString stringWithFormat:@"name:%@", _name]; //因为外部无法直接访问此变量,重写description方法观察此变量变化}@end
//为说明问题,以下不考虑内存管理以及头文件引入等细节,</span>
#import "Car.h"int main(int argc, const char * argv[]) { Car *car = [[Car alloc] init]; [car setValue:@"BMW" forKey:@"name"]; NSLog(@"%@",car); return 0;}//来观察一下打印值
name:BMW//依然给成员变量_name赋值成功了,
//注:这里不考虑手动申明禁止通过key-value方式赋值的情况</span>
//确实非常神奇,自己尝试实现一下,想到两种方法,</span></span>
//1,依赖set方法(显然不是系统的实现方式,但容易想到,也容易实现),亦可以实现部分功能</span>
@implementation NSObject(KVC)- (void)my_setValue:(id)value forKey:(NSString *)key { NSString *my_key = [key capitalizedString]; //先首字母大写
my_key = [NSString stringWithFormat:@"set%@:",my_key];//拼接字符串,方便和set方法关联 SEL sel = NSSelectorFromString(my_key); objc_msgSend(self, sel, value);//调用set方法进行赋值, }
</pre>//2,对成员变量进行直接操作,修改属性值,<pre>
- (void)my__setValue:(id)value forKey:(NSString *)key { Class cls = [self class]; /** 此行代码可获得指定key的ivar */ Ivar IVAR = class_getInstanceVariable(cls, [[NSString stringWithFormat:@"_%@", key] UTF8String]); object_setIvar(self, IVAR, value);
#if 0 //此代码段是优化前尝试用,获得思路 unsigned int outCount; Ivar *ivars = class_copyIvarList(cls, &outCount); for (int i = 0; i < outCount; i++) { Ivar ivar = ivars[i]; const char *ch = ivar_getName(ivar); NSString *ivarStr = [NSString stringWithUTF8String:ch]; NSString *keyStr = [NSString stringWithFormat:@"_%@", key]; if ([ivarStr isEqualToString:keyStr] ) { object_setIvar(self, ivar, value);// NSLog(@"%@",ivarStr ); } }#endif}//引入头文件可以达到和系统KVC一样的效果,访问私有变量
Car *car = [[Car alloc] init]; [car my__setValue:@"BMW" forKey:@"name2"]; NSLog(@"%@",car);
</pre><pre name="code" class="objc">自己的一点尝试和收获,每天多学一点,生活美好一些。<img src="http://img.blog.csdn.net/20160227205401095?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
0 0
- Objective-C ,KVC研究,几种属性赋值的方法
- Objective-C KVC 自动转换类型研究
- Excel中工作薄几种属性的设置(C#)
- position的几种属性
- Interpolator的几种属性
- 对FileStream的几种属性和方法认识
- Objective-C的Initialize初始化方法研究
- Objective-C的Initialize初始化方法研究
- Objective-C的Initialize初始化方法研究
- Objective-C的Initialize初始化方法研究
- Objective-C的Initialize初始化方法研究
- Objective-C的Initialize初始化方法研究
- Objective-C的Initialize初始化方法研究
- Objective-C的Initialize初始化方法研究
- Spring 几种属性的注入
- Spring中几种属性的配置
- QML几种属性
- Objective-C语法之KVC的使用
- 中国计算机学会CCF推荐国际学术会议和期刊目录-软件工程/系统软件/程序设计语言
- Grub2引导Grub4dos菜单写法
- DFS算法初探
- 中国计算机学会CCF推荐国际学术会议和期刊目录-计算机科学理论
- PHP的工作原理以及lamp四者之间的关系
- Objective-C ,KVC研究,几种属性赋值的方法
- 反汇编一个简单的C程序
- 中国计算机学会CCF推荐国际学术会议和期刊目录-人机交互与普适计算
- 多态的应用
- 一些关于贾志鹏线性筛的知识
- 如何设计一个 iOS 控件?(iOS 控件完全解析)
- 浅析swift 中常量&变量&Optional可选项
- 执行计划
- 中国计算机学会CCF推荐国际学术会议和期刊目录-交叉/综合/新兴