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

第一篇博文,分享一下自己对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="https://img-blog.csdn.net/20160227205401095?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
 

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值