美文网首页
iOS原理(二)----KVO,KVC

iOS原理(二)----KVO,KVC

作者: 会笑的Even | 来源:发表于2018-12-27 00:40 被阅读0次

iOS原理(二)----KVO,KVC

KVO

KVO的全称是Key-Value Observing,俗称“键值监听”,可以用于监听某个对象属性值的改变.下面是一个简单实用KVO的例子:

@interface Animal : NSObject

@property (nonatomic,assign) int age;

@end

@implementation Animal

@end


- (void)viewDidLoad {
    [super viewDidLoad];
    
     self.ani = [[Animal alloc] init];
    self.ani.age = 10;
    [self.ani addObserver:self forKeyPath:@"age" options:NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew context:nil];
    

}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    self.ani.age = 20;
}

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
    NSLog(@"%@---%@---%@",keyPath,object,change);
}

通过断点发现添加KVO后,对象的isa指针变为NSKVONotifying_Animal,

Snip20181109_16.png

setAge实际调用为:NSSetIntValueAndNotify

Snip20181109_17.png

大概实现为:

  • 调用willChangeValueForKey.
  • 调用原来的setter实现.
  • 调用didChangeValueForKey.

didChangeValueForKey:内部会调用observer的observeValueForKeyPath:ofObject:change:context:方法.

KVO动态生成的类,还会重写class,dealloc,_isKVOA等.调用class方法,会得到原来的类对象,对外封装实现细节.

所以KVO的本质为:利用RuntimeAPI动态生成一个子类,并且让instance对象的isa指向这个全新的子类,当修改instance对象的属性时,会调用Foundation的_NSSetXXXValueAndNotify函数,然后依次调用willChangeValueForKey,父类原来的setter和didChangeValueForKey(内部会触发监听器(Oberser)的监听方法( observeValueForKeyPath:ofObject:change:context:)).

当对象值没有改变时,我们任然要触发KVO时,我们可以手动触发KVO:手动调用willChangeValueForKey:和didChangeValueForKey.直接修改成员变量的值不会触发KVO.

KVC

KVC的全称是Key-Value Coding,俗称“键值编码”,可以通过一个key来访问某个属性
.

setValue:forKey:的原理:

  • 按照setKey:、_setKey:顺序查找方法,如果找到方法,传递参数,调用方法.
  • 如果没有找到方法,查看accessInstanceVariablesDirectly方法的返回值.
  • 如果返回值为NO,调用setValue:forUndefinedKey:并抛出异常NSUnknownKeyException.
  • 如果返回值为YES,按照_key、_isKey、key、isKey顺序查找成员变量,如果找到成员变量,就只直接赋值,没有调用setValue:forUndefinedKey:并抛出异常NSUnknownKeyException.

valueForKey:的原理:

  • 按照getKey、key、 isKey、_key顺序查找方法,如果找到方法,调用方法.
  • 如果没有找到方法,查看accessInstanceVariablesDirectly方法的返回值.
  • 如果返回值为NO,调用valueForUndefinedKey:并抛出异常NSUnknownKeyException.
  • 如果返回值为YES,按照_key、_isKey、key、isKey顺序查找成员变量,如果找到成员变量,就只直接赋值,没有调用valueForUndefinedKey:并抛出异常NSUnknownKeyException.

KVC会自动触发KVO.

相关文章

  • iOS原理(二)----KVO,KVC

    iOS原理(二)----KVO,KVC KVO KVO的全称是Key-Value Observing,俗称“键值监...

  • iOS - KVO

    [toc] 参考 KVO KVC 【 iOS--KVO的实现原理与具体应用 】 【 IOS-详解KVO底层实现 】...

  • KVC

    KVC原理剖析 - CocoaChina_让移动开发更简单 iOS开发底层细究:KVC和KVO底层原理 | iOS...

  • KVO和KVC的使用及原理解析

    一 KVO基本使用 二 KVO本质原理讲解及代码验证 三 KVC基本使用 四 KVC设值原理 五 KVC取值原理 ...

  • iOS面试题:KVC的赋值和取值过程是怎样的?KVO原理是什么?

    更多:iOS面试题大全 1、KVC赋值 2、 KVC取值 3、 KVO原理 KVO 是 Objective-C 对...

  • iOS日记15-KVC

    1.iOS开发技巧系列---详解KVC 2.漫谈 KVC 与 KVO 3.KVC/KVO原理详解及编程指南 关键点...

  • KVC,KVO

    KVC , KVO KVC和KVO的区别及应用 KVC/KVO原理 1. KVC键值编码 KVC,即是指NSKey...

  • iOS底层学习文章

    iOS黑魔法-Method Swizzling Objective-C 反射机制 KVC原理剖析 KVO原理分析及...

  • iOS 面试题之基础知识

    一、KVC 和 KVO的区别以及他们的实现原理,项目中用到KVC的地方 二、iOS的内存区分 三、UIView和C...

  • 说一下KVC和KVO

    本篇采用简单的例子,来介绍 iOS 中的 KVC 和 KVO 的用法和实现原理。 一、KVC 1. KVC是什么 ...

网友评论

      本文标题:iOS原理(二)----KVO,KVC

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