KVO

1.添加观察者

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

第一个参数  观察者是谁

第二个参数 监听哪一个属性

第三个参数 有四个枚举变量选择

第四个参数 


2.监听到属性改变的时候,会调用

- (void)observeValueForKeyPath:(nullableNSString*)keyPath ofObject:(nullableid)object change:(nullableNSDictionary *)change context:(nullablevoid*)context;


3.KVO的通知默认有两种模式

+(BOOL)automaticallyNotifiesObserversForKey:(NSString*)key;

将某个对象的这个方法返回值设置成NO的时候,监听这个对象的属性就变成了手动的KVO机制。

willChangeValueForKey  didChangeValueForKey

这两个方法手动执行KVO


4.监听一个属性里面的属性  (监听一个类的成员变量的成员变量)

直接添加观察者的时候,使用点语法(eg:@"dog.age")


5.观察dog类下面的多个属性

        1.在添加监听的时候,监听dog

        2.

//返回一个容器 里面放字符串类型

+(NSSet *)keyPathsForValuesAffectingValueForKey:(NSString*)key{

    NSSet *keyPaths = [super keyPathsForValuesAffectingValueForKey:key];

    if([key isEqualToString:@"dog"]) {

        NSArray *arr = @[@"_dog.level",@"_dog.age"];

        keyPaths = [keyPaths setByAddingObjectsFromArray:arr];

    }

    returnkeyPaths;

}


6.运用runtime动态修改监听对象的类型

NSKVONotifying


7.重写监听方法

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

    //1.自定义一个NSKVONotifying_Person子类

    NSString*oldclassName =NSStringFromClass(self.class);

    NSString*newClassName = [@"ZXKVO_"stringByAppendingString:oldclassName];

    /*文本注释

       创建一个类

        第一个参数创建类的父类

        第二个参数类的名称

        第三个参数暂时不考虑

     */

    ClassMyclass =objc_allocateClassPair(self.class, newClassName.UTF8String,0);

    //注册该类

    objc_registerClassPair(Myclass);

    //2.动态修改

    object_setClass(self, Myclass);

    //3.添加setName方法  重写父类的方法可以说是给子类添加方法

    class_addMethod(Myclass,@selector(setName:), (IMP)haha,"v@:@");


消息发送机制

objc_msgSend(_p,@selector(setName:),);

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 写在前面 程序设计语言中有各种各样的设计模式(pattern)和与此对应的反设计模式(anti-pattern),...
    Frankxp阅读 4,976评论 0 23
  • 本文由我们团队的 纠结伦 童鞋撰写。 文章结构如下: Why? (为什么要用KVO) What? (KVO是什么...
    知识小集阅读 7,429评论 7 105
  • KVC 与 KVO 是 Objective-C 的关键概念. KVC: KVC,即是指 NSKeyValueCod...
    无名小鱼会吐火阅读 310评论 0 0
  • 上半年有段时间做了一个项目,项目中聊天界面用到了音频播放,涉及到进度条,当时做android时候处理的不太好,由于...
    DaZenD阅读 3,052评论 0 26
  • 本篇会对KVO的实现进行探究,不涉及太多KVO的使用方法,但是会有一些使用时的思考。 一、使用上的疑问 1.key...
    奋拓达阅读 552评论 0 2