美文网首页
iOS-KVO篇

iOS-KVO篇

作者: MirL | 来源:发表于2021-06-28 15:31 被阅读0次

一、前言

KVO(Key-value observing)键值编码,是Objective-C对观察者设计模式的又一实现,系统利用了指针混写技术(isa-swizzing)来实现KVO

二、常用的方法说明

// 注册Observer: observer:观察者, keyPath:要观察的属性名称, options:对KVO机制进行配置, context: 传入任意类型的对象
addObserver:forKeyPath:options:context:

// 接收通知: keyPath:被监听的对象的属性,object:被监听的对象,change:被监听的对象的属性值的变化,是一个字典,
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context

// 移除观察者
-removeObserver:forKeyPath:

// 自动开关
+ (BOOL) automaticallyNotifiesObserversOfSteps

// 组合监听key值
+ (NSSet<NSString *> *)keyPathsForValuesAffectingValueForKey:(NSString *)key

三、底层原理

  1. 当一个对象使用了KVO监听,iOS系统会修改这个对象的isa指针,改为指向一个全新的通过Runtime动态创建的子类NSKVONotifying_xxx
  2. 然后动态添加setter方法
  3. 动态添加class方法
  4. 动态添加dealloc方法
  5. 开启手动观察,在setter方法前后调用willChangeValueForKeydidChangeValueForKey方法
  6. 消息转发给原类 newValue
  7. 消息发送-响应回调方法

四、总结

  1. 使用setter方法改变值KVO才会生效
  2. 使用setValue:forKey:改变值KVO才会生效
  3. 成员变量直接修改需手动添加KVO才会生效
//直接为成员变量赋值
[self willChangeValueForKey:@"value"];
_value += 1;
[self didChangeValueForKey:@"value"];

相关文章

  • iOS-KVO(二) 使用注意点

    iOS-KVO(一) 基本操作iOS-KVO(二) 使用注意点iOS-KVO(三) 窥探底层实现iOS-KVO(四...

  • iOS-KVO(三) 窥探底层实现

    iOS-KVO(一) 基本操作iOS-KVO(二) 使用注意点iOS-KVO(三) 窥探底层实现iOS-KVO(四...

  • iOS-KVO(四) 自定义KVO+Block

    iOS-KVO(一) 基本操作iOS-KVO(二) 使用注意点iOS-KVO(三) 窥探底层实现iOS-KVO(四...

  • iOS-KVO(一) 基本操作

    iOS-KVO(一) 基本操作iOS-KVO(二) 使用注意点iOS-KVO(三) 窥探底层实现iOS-KVO(四...

  • iOS-KVO篇

    一、前言 KVO(Key-value observing)键值编码,是Objective-C对观察者设计模式的又一...

  • iOS-KVO本质

    参考篇:iOS-KVO浅谈 前言:本文简述KVO本质,如有错误请留言指正。 什么是KVO? KVO的全称是Key-...

  • iOS-KVO

    一、VKO 简述 KVO 全称 Key Value Observing,俗称“键值监听”;可以监听对象某个属性值的...

  • iOS-KVO

    简介 先来看看官方的定义: Key-value coding is a mechanism enabled by ...

  • iOS-KVO

    一.kvo使用 kvo可以监听一个对象属性的变化,下面为简单使用. 二.使用runtime分析kvo 我写了个简单...

  • iOS-KVO

    KVO(Key-Value observing):是苹果提供的一套事件通知机制.允许对象监听另一个对象特定属性的改...

网友评论

      本文标题:iOS-KVO篇

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