美文网首页
KVO原理及代码

KVO原理及代码

作者: 不掉头发的程序猿 | 来源:发表于2018-07-09 14:13 被阅读0次

1.KVO分为自动和手动

当+ (BOOL)automaticallyNotifiesObserversForKey:(NSString*)key为YES的时候自动观察,可以观察到属性的变化

当为NO的话在set方法前后willChangeValueForKey   didChangeValueForKey既可以观察到属性的变化

2.当观察数组的元素变化的时候,不可以直接观察,可以使用kvc进行观察

NSMutableArray *arr = [self.personPeople mutableArrayValueForKey:@"arr"];

  [arraddObject:@"123"];

3.当观察一个类对象的时候,可以分别观察类对象.属性:

 [paddObserver:self forKeyPath:@"dogg.age" options:(NSKeyValueObservingOptionNew) context:nil];

也可以使用这个方法来

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

{

    NSLog(@"%@",key);

    NSSet *keyPaths = [super keyPathsForValuesAffectingValueForKey:key];

    if([keyisEqualToString:@"dogg"]) {

        NSArray *arr = @[@"_dogg.age",@"_dogg.ageee"];

        keyPaths = [keyPathssetByAddingObjectsFromArray:arr];

    }

    returnkeyPaths;

}

此时观察的时候:

 [paddObserver:self forKeyPath:@"dogg" options:(NSKeyValueObservingOptionNew) context:nil];即可观察到dogg的age和ageee的属性变化

4.根据KVO的原理,动态创建被观察类的子类,并添加set方法(其实创建子类并不意味着我们就有了该属性的set方法,否者也不会出现通过继承关系找类的实现),在改变前后告诉被观察者属性的改变,并通过isa指针指向元类

此时我们可以自己写kvc的观察

- (void)MT_addObserver:(NSObject*)observer forKeyPath:(NSString*)keyPath options:(NSKeyValueObservingOptions)options context:(void*)context{

    //1.判断kayPath是否存在

    SELsetterSeletor =NSSelectorFromString([NSStringstringWithFormat:@"set%@:",keyPath.capitalizedString]);

    ClasssuperClass =object_getClass(self.class);

    //2.自定义一个被观察类的子类

    NSString*oldClassName =NSStringFromClass(self.class);

    NSString*newClassName = [NSStringstringWithFormat:@"MTKVO_%@",oldClassName];

    //创建一个类

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

    //注册该类

    objc_registerClassPair(newClass);

    //2.动态修改该类和被观察类绑定

    object_setClass(self, newClass);

    //3.添加setName方法,此时一定要对应setName这样类似的方法,IMP是函数指针找到对应的函数,“V”表示void,@表示oc参数

    class_addMethod(newClass, setterSeletor, (IMP)haha,"v@:@");

}

//oc方法中有2个隐藏参数:id self,SEL _cmd,此时应该添加上,否者打印不出对应属性

voidhaha(idself,SEL_cmd,NSString*newName){

    NSLog(@"%@",newName);

}

demo地址:GitHub - 969661780/KVO: KVO原理

相关文章

  • KVO和KVC的使用及原理解析

    一 KVO基本使用 二 KVO本质原理讲解及代码验证 三 KVC基本使用 四 KVC设值原理 五 KVC取值原理 ...

  • KVO原理及代码

    1.KVO分为自动和手动 当+ (BOOL)automaticallyNotifiesObserversForKe...

  • iOS-自定义KVO

    KVO原理及使用 我们之前讨论过KVO的原理,知道KVO机制是生成了一个中间类NSKVONotifying,该中间...

  • KVC,KVO

    KVC , KVO KVC和KVO的区别及应用 KVC/KVO原理 1. KVC键值编码 KVC,即是指NSKey...

  • OC的KVO学习记录(2)

    仿写KVO的实现KVO原理参考可前一篇OC的KVO学习记录代码github地址:Sameny仿写KVO 注:关键代...

  • 面试题整理

    KVO原理及自定义KVO KVO原理我们注册监听的时候,会对注册者动态的创建一个子类对象,然后底层找方法的的isa...

  • iOS探索KVO实现原理,重写KVO

    写响应式编程博客时,提到了KVO,今天我们探索一下KVO的实现原理及如何自己实现KVO功能 首先简单的KVO实现 ...

  • iOS底层学习文章

    iOS黑魔法-Method Swizzling Objective-C 反射机制 KVC原理剖析 KVO原理分析及...

  • —— KVO、KVC

    1. KVO 的原理 对于下面使用KVO的例子,仅仅调用一行代码,便实现了实现 KVO 机制。 在修改属性值时,只...

  • KVC设置value为nil抛异常的处理

    1. KVC赋值为什么能触发KVO 上一篇KVO的原理及应用[https://www.jianshu.com/p/...

网友评论

      本文标题:KVO原理及代码

      本文链接:https://www.haomeiwen.com/subject/fbovuftx.html