美文网首页
KVC的执行流程

KVC的执行流程

作者: Bel李玉 | 来源:发表于2020-10-24 16:10 被阅读0次

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

Basic Setter

  • 1,首先查找 set<Key>:或者_set<Key>方法有没有实现。
  • 2,如果实现了accessInstanceVariablesDirectly方法,并且返回值为YES,则查找类似于_<key>, _is<Key>, <key>, or is<Key>的变量名,如果找到一个,就将值赋给该属性。
  • 3,如果没找到方法或者属性,就会唤起[valueForUndefinedKey:]方法,如果没有实现该方法,则会造成crash

下面我们新建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方法,则会调用setName方法,不会再调用其他方法。

下一步,我们将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方法,就会调用_setName方法。

我们将 _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 方法。

小结

  • 我们对 name属性进行KVC赋值时,会依次查找 setName -> _setName -> setIsName方法。
  • 如果实现了setName方法,则不会继续往下查找。

Basic Getter

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

  • 1,首先会按照get<Key>, <key>, is<Key>, or _<key>的顺序依次进行查找。
  • 2,如果该值为一个对象指针,则直接返回该值。
  • 3,如果没有找到值,则会唤起[valueForUndefinedKey:]方法,如果没有实现这个方法,则会引起crash

我们沿用上面的例子,增加其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
  • 1,由于我们实现了getName方法,则 其他get方法就不会被调用。

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

相关文章

  • KVC的执行流程

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

  • [KVC系列]底层执行流程

    KVC系列-底层执行流程 相当于是对KVC官方文档第二部分的一个总结 Search Pattern for the...

  • 八:KVC底层原理探究(下)

    前言: 上小节为大家介绍了kvc设值的流程,这节为大家继续讲解一下kvc取值的流程,其实流程和设值的方式差不多,大...

  • KVC、关联对象、objc_msgSend执行流程

    年根底下无聊,画了几张图。由于时间关系就画了六张。 1、KVC赋值原理 2、KVC取值原理 3、关联对象 4、消息...

  • kvc流程分析

    KVC:全称为keyValueCoding,简称键值编码。是对NSObjcet的扩展,分类名为 : NSKeyVa...

  • yield执行流程

    yield 执行流程 上面的执行流程将会如何输出呢? 说明了,generator的执行流程为 g() 实际不会执行...

  • C语言基础继续讲讲(循环语句-数组)

    C语言基础 三大执行流程 顺序执行流程 条件执行流程if语句if(条件){ 语句体}如果条件成立,就执行{}...

  • KVC

    什么是KVC? key - value - coding 键值编码技术 valueforkey 流程图: 通过k...

  • KVC进阶(二)

    前言 上篇文章大致阐述了KVC在key正确情况下的执行过程,这篇来说说key错误时KVC是如何运行的。 正文 如果...

  • KVC、KVO探识(三)KVC你不知道的细节(执行顺序)

    前言 今天主要探究一些KVC几个方法的执行顺序。表面浅显的东西,其实也内有乾坤。这点东西,你真的未必懂! KVC执...

网友评论

      本文标题:KVC的执行流程

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