您的位置:首页 > 移动开发 > Objective-C

Objective-C ,KVC研究,几种属性赋值的方法

2016-02-27 19:16 375 查看
第一篇博文,分享一下自己对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="" />




                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: