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
原创粉丝点击