KVC的执行流程

2020-10-24  本文已影响0人  Bel李玉

在这篇文章中,我们将探索KVC的执行流程,首先我们可以从官方文档中找到该流程Apple Document KVC

Basic Setter

下面我们新建LYPerson类,并设置name属性的值,并使用 setValue(:)ForKey(:)进行赋值

 LYPerson *person = [[LYPerson alloc] init];
 [person setValue:@"LY" forKey:@"name"];
@interface LYPerson : NSObject {
@public
    NSString *_isName;
    NSString *name;
    NSString *isName;
    NSString *_name;
}
@end

@implementation LYPerson

//MARK: - setKey. 的流程分析
- (void)setName:(NSString *)name{
    NSLog(@"%s - %@",__func__,name);
}

- (void)_setName:(NSString *)name{
    NSLog(@"%s - %@",__func__,name);
}

- (void)setIsName:(NSString *)name{
    NSLog(@"%s - %@",__func__,name);
}

- (void)_setIsName:(NSString *)name {
    NSLog(@"%s - %@", __func__, name);
}
@end

 LYPerson *person = [[LYPerson alloc] init];
 [person setValue:@"LY" forKey:@"name"];

// 输出结果
2020-10-24 15:41:50.788791+0800 002-KVC取值&赋值过程[54677:6355080] -[LYPerson setName:] - LY

下一步,我们将setName方法去掉

//- (void)setName:(NSString *)name{
//    NSLog(@"%s - %@",__func__,name);
//}

- (void)_setName:(NSString *)name{
    NSLog(@"%s - %@",__func__,name);
}

- (void)setIsName:(NSString *)name{
    NSLog(@"%s - %@",__func__,name);
}

- (void)_setIsName:(NSString *)name {
    NSLog(@"%s - %@", __func__, name);
}

// 运行结果
2020-10-24 15:46:13.075257+0800 002-KVC取值&赋值过程[54767:6360026] -[LYPerson _setName:] - LY

我们将 _setName注释掉,看下运行结果:

//- (void)setName:(NSString *)name{
//    NSLog(@"%s - %@",__func__,name);
//}

//- (void)_setName:(NSString *)name{
//    NSLog(@"%s - %@",__func__,name);
//}

- (void)setIsName:(NSString *)name{
    NSLog(@"%s - %@",__func__,name);
}

- (void)_setIsName:(NSString *)name {
    NSLog(@"%s - %@", __func__, name);
}
2020-10-24 15:49:03.530758+0800 002-KVC取值&赋值过程[54820:6362797] -[LYPerson setIsName:] - LY

接下来,我们将setIsName注释掉

//MARK: - setKey. 的流程分析
//- (void)setName:(NSString *)name{
//    NSLog(@"%s - %@",__func__,name);
//}

//- (void)_setName:(NSString *)name{
//    NSLog(@"%s - %@",__func__,name);
//}

//- (void)setIsName:(NSString *)name{
//    NSLog(@"%s - %@",__func__,name);
//}

- (void)_setIsName:(NSString *)name {
    NSLog(@"%s - %@", __func__, name);
}
// 运行结果
并不会执行 _setIsName 方法。

小结

Basic Getter

使用KVC进行取值时,使用valueForKey:方法,它的调用流程如下:

我们沿用上面的例子,增加其set方法

- (NSString *)getName{
    return NSStringFromSelector(_cmd);
}

- (NSString *)name{
    return NSStringFromSelector(_cmd);
}

- (NSString *)isName{
    return NSStringFromSelector(_cmd);
}

- (NSString *)_name{
    return NSStringFromSelector(_cmd);
}

我们对name属性进行取值,并查看打印结果

 NSLog(@"取值:%@",[person valueForKey:@"name"]);


2020-10-24 16:19:16.308404+0800 002-KVC取值&赋值过程[55401:6394378] 取值:getName

读者如果有兴趣的话,可以将getNamenameisName_name方法注释掉,查看其调用情况。

上一篇 下一篇

猜你喜欢

热点阅读