美文网首页KVC
Objective-C KVC总结

Objective-C KVC总结

作者: 番茄炒西红柿啊 | 来源:发表于2020-10-10 09:49 被阅读0次

    大纲

    • setValue:forKeysetValue:forKeyPath
    • 赋值流程解析
    • 取值流程解析

    1. setValue:forKey 和 setValue:forKeyPath

    @interface CWObject: NSObject{}
    @property (nonatomic, assign) NSInteger count;
    @end
    

    我们可以通过KVC给count赋值

    - (void)viewDidLoad {
        [super viewDidLoad];
        
        CWObject *obj = [[CWObject alloc] init];
        
        [obj setValue:@1 forKey:@"count"];
        NSLog(@"%ld", obj.count);
        
        [obj setValue:@2 forKeyPath:@"count"];
        NSLog(@"%ld", obj.count);
    }
    

    既然都能赋值,那么key和keyPath的区别是什么呢?直接看演示代码

    @interface Cat: NSObject{}
    @property (nonatomic, assign) CGFloat weight;
    @end
    
    @interface CWObject: NSObject{}
    @property (nonatomic, assign) NSInteger count;
    @end
    

    keyPath可以多级关联,但是key不可以,代码如下

    - (void)viewDidLoad {
        [super viewDidLoad];
        
        CWObject *obj = [[CWObject alloc] init];
        obj.cat = [[Cat alloc] init];
        
        [obj.cat setValue:@1.0 forKey:@"weight"];
        NSLog(@"%lf", obj.cat.weight);
        
        [obj setValue:@2.0 forKeyPath:@"cat.weight"];
        NSLog(@"%lf", obj.cat.weight);
    }
    

    当赋值或者取值时,key不存在会crash,为了防止可以重写如下两个方法:

    - (void)setValue:(id)value forUndefinedKey:(NSString *)key {
        NSLog(@"setValueForKey: [%@] undefined!", key);
    }
    
    - (id)valueForUndefinedKey:(NSString *)key {
        NSLog(@"getValueForKey: [%@] undefined!", key);
        return nil;
    }
    

    2. 赋值流程图

    赋值流程图

    3. 取值流程图

    取值流程图
    • 关于取值流程图,其实里面还有countOf<key>objectIn<key>AtIndex<key>AtIndexesenumeratorOf<key>memberOf<key>这一套流程,在图中没有画出来,因为平时基本用不上,后面可能会考虑加上。

    流程图这里就不一一贴验证代码了,有兴趣的可以自行验证。

    相关文章

      网友评论

        本文标题:Objective-C KVC总结

        本文链接:https://www.haomeiwen.com/subject/rraxyktx.html