ios进阶iOS进阶

KVO底层原理

2020-02-13  本文已影响0人  CS_SDN

一、概念定义

图片.png

由官网文档可见,通过对KVC的了解,也是对KVO的进一步升华。

二、KVO初探

context

系统给的方法:

- (void)addObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(nullable void *)context;

实际运用中:
思考:context为什么用NULL类型而不是nil?


图片.png

官方文档说明:


图片.png

思考:context到底要不要写成NULL,有什么影响?设置它的值到底有什么意义呢?


图片.png

大致意思:您可以指定NULL并完全依赖键路径字符串来确定更改通知的来源,但是这种方法可能会给对象的父类带来问题,该对象的超类也出于不同的原因而观察相同的键路径。
一种更安全,更可扩展的方法是使用上下文确保您收到的通知是发给观察者的,而不是超类的。

假如不需要context


图片.png

此时就需要在

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context

这个方法中一层层的去判断和识别要观察的对象,流程比较繁琐


移除通知观察(需不需要移除)
图片.png

结论:如果不移除,则会造成对象地址野指针,所以一定要在跳转页面的时候移除当前页的KVO


嵌套路径

自动和手动

核心代码:


图片.png

官方解释:


图片.png
  1. 自动
    核心代码
// 自动开关
+ (BOOL) automaticallyNotifiesObserversForKey:(NSString *)key{
    return YES;  //启动自动观察
}
  1. 手动
    核心代码
// 自动开关
+ (BOOL) automaticallyNotifiesObserversForKey:(NSString *)key{
    return NO; //关闭自动观察,准备手动观察
}
图片.png
可变数组

三、KVO实现原理

KVO是基于runtime机制实现的,KVO运用了isa-swizzling技术,isa-swizzling就是类型混合指针机制, 将2个对象的isa指针互相调换, 就是俗称的黑魔法.


上一篇 下一篇

猜你喜欢

热点阅读