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:),);

你可能感兴趣的:(KVO)