美文网首页
自定义KVO

自定义KVO

作者: zzL丶 | 来源:发表于2019-12-12 15:44 被阅读0次

1.自定义观察者方法

- (void)lz_addObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(void *)context {
    NSString *oldName = NSStringFromClass(self.class);
    NSString *newName = [NSString stringWithFormat:@"LZKVO_%@",oldName];
    //创建类
    Class customClass = objc_allocateClassPair(self.class, newName.UTF8String, 0);
    //注册类
    objc_registerClassPair(customClass);
    //修改指针
    object_setClass(self, customClass);
    //重写set方法
    NSString *methodName = [NSString stringWithFormat:@"set%@:",keyPath.capitalizedString];
    SEL sel = NSSelectorFromString(methodName);
    class_addMethod(customClass, sel, (IMP)customSetMethod, "v@:@");
    //保存观察者
    objc_setAssociatedObject(self, (__bridge const void*)@"observer", observer, OBJC_ASSOCIATION_ASSIGN);
}

2.重写set方法并通知观察者

void customSetMethod(id self, SEL _cmd, NSString *name) {
    //调用父类
    struct objc_super superClass = {
        self,
        class_getSuperclass([self class])
    };
    objc_msgSendSuper(&superClass, _cmd, name);
    id observer = objc_getAssociatedObject(self, (__bridge const void*)@"observer");
    //发出通知
    NSString *methodName = NSStringFromSelector(_cmd);
    NSRange range = NSMakeRange(3, setter.length - 4);
    NSString *key = [setter substringWithRange:range];
    NSString *letter = [[key substringToIndex:1] lowercaseString];
    key = [key stringByReplacingCharactersInRange:NSMakeRange(0, 1) withString:letter];
    objc_msgSend(observer, @selector(observeValueForKeyPath:ofObject:change:context:), key, self, @{key:name}, nil);
}

相关文章

  • iOS runtime自定义实现KVO

    1、了解KVO 打印结果: 2、自定义实现KVO .h .m

  • KVO基本使用

    分三部分解释KVO一.KVO基本使用二.KVO原理解析三.自定义实现KVO 一、KVO基本使用 使用KVO,能够非...

  • KVC/ KVO

    1、kvc原理: 45页 2、自定义KVO KVO参考链接 KVO默认观察setter,使用isa-swizzli...

  • iOS-底层原理-自定义KVO

    1.自定义KVO 1.上一篇博客了解了iOS 系统KVO的底层实现原理,那么这里进行自定义KVO,更好的理解原理和...

  • iOS 自定义KVO

    利用Runtime 实现简单的自定义kvo 代码githubgithub.com/zswj/custom-KVO ...

  • 自定义KVO,自动释放,监听多个属性

    自定义的 KVO,支持多属性监听,支持自动释放。 使用系统 KVO 监听属性 先来回顾下系统 KVO 是如何使用的...

  • 21.iOS底层学习之KVO自定义

    本篇文章提纲:1、自定义KVO2、函数式KVO3、KVO的自动销毁机制4、FBKVOController5、GNU...

  • KVO 本质 & 自定义实现

    KVO 本质 & 自定义实现 KVO 是什么? Key-Value Observer 即键值观察者。作用为监听某个...

  • Key-Value Observing(kvo)二:自定义kvo

    一、自定义kvo 在上篇文章 kvo原理分析[https://www.jianshu.com/u/a569f590...

  • iOS - 自定义KVO

    之前我们已经了解过了KVO的底层实现原理,不过呢,在我们开始实现自定义KVO之前再来简单回顾下KVO的实现原理 1...

网友评论

      本文标题:自定义KVO

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