KVC

Objective-C KVC总结

2020-10-10  本文已影响0人  番茄炒西红柿啊

大纲

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. 取值流程图

取值流程图

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

上一篇下一篇

猜你喜欢

热点阅读