IMG_5776.JPG

目录

  • KVO的细节,context、观察数组
  • KVO的原理
  • 自定义KVO

KVO细节

  • context -> NULL,代表传入了一个空对象
  • contenx如果是id类型,则可以传入nil,是void *类型,则传NULL
  • context传入值,使整体性能更加安全、获取更直接
    • 设置static void *PersonNameContext = &PersonNameContext
      • (void)observeValueForKeyPath:(NSString )keyPath ofObject:(id)object change:(NSDictionary )change context:(void )context*直接处理content

image.png

  • 移除观察者,iOS9 之后不需要做移除操作
  • 未移除观察者,还会继续向ViewController发送通知,当设置object为单例时,向被释放的内存发送消息会崩溃

音视频设备模块框架图 (8).jpg

  • 手动、自动
  • 下载进度 = 已下载 / 总数
  • 对可变数组的观察

IMG_829B54BE866C-1.jpeg


底层原理

  1. isa -> Person -> NSKVONotifying_Person(动态子类) -> 移除观察后这个类是否销毁
    1. 底层动态生成,runtime register类簇
    2. NSKVONotifying_Person与Person是父子关系,Student -> NSKVONotifying_Person -> Person
    3. NSKVONotifying_Person包含了哪些东西 - 方法
      1. 重写方法——-
      2. setNickName
      3. class
      4. dealloc
      5. _isKVOA
    4. isa回来
    5. NSKVONotifying_Person 销毁
  2. setter 方法 属于新建的动态子类
    1. setter方法可以区分属性和成员
  3. 明面 Person - setter 谁的?—-> NSKVONotifying_Person
  4. Person 与 xxx 关系
  5. 主类销毁时,NSKVONotifying_Person还存在

未命名文件 (20).jpg


自定义KVO

  1. 观察的是属性,不能让成员变量进来
  2. 动态生成子类
  3. isa的指向 : KVONotifying_Person
  4. 保存观察者 -> 关联对象 保存数组
  5. 优化,自动释放,直接添加方法,em_dealloc -> setClass -> 父类

image.png


  • 底层runtime方法一般以objc、object、class开头

1631775948489.jpg


image.png


FBKVOController

  • FBKVOController不是单例,内部有单例进行保存
  • 关联对象,保存了一个NSMutablSet集合
  • 传入的是vc的属性,不是vc

image.png

  • self释放 -> FBKVOTrl -> FB单例 -> self.person

image.png

流程图

路由器类图 (5).jpg