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