美文网首页
聊一聊KVO

聊一聊KVO

作者: 晨阳Xia | 来源:发表于2020-12-23 12:22 被阅读0次

kvo具体的实现过程

1.首先只能作用于属性
2.要注册观察者

注册观察者之后,instance对象有什么变化?

    @interface Student : NSObject{
        double _no;
        double _no1;
        double _no2;
    }
    
    @property(nonatomic, strong) NSString *name;
    
    @end
    
    @implementation Student
    
    @end
    // NSKVONotifying_Student
    self.studentObj1 = [[Student alloc] init];
        NSKeyValueObservingOptions options = NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld;
        [self.studentObj1 addObserver:self forKeyPath:@"name" options:options context:nil];
    
    // Student    
    self.studentObj2 = [[Student alloc] init];

同一类型的两个instance对象没有注册观察则,isa指向Student类对象
同一类型的两个instance对象,注册了观察者之后,isa指向NSKVONotifying_Student类对象。底层是runtime动态创建了NSKVONotifying_Student类型的新类,这个类是Student的子类。

    // 系统重写监听类的伪代码
    @interface NSKVONotifying_Student : Student
    
    @end
    
    @implementation NSKVONotifying_Student
    // 重写了setName:方法
    - (void)setName:(NSString *)name {
        _NSSetIntValueAndNofify();
    }
    
    void _NSSetIntValueAndNofify() {
        [self willChangeValueForKey:@"name"];
        [super setName:@"name"];
        [self didChangeValueForKey:@"name"];
    }
    
    - (void)didChangeValueForKey:(NSString *)key {
        [observe observeValueForKeyPath:key ofObject:self change:change context:change];
    }
    
    @end

NSKVONotifying_Student

它的instance对象的isa指向它自己的class对象,他的class对象的isa指向meta-class对象。

代理和kvo的效率哪个更高

代理的效率高,kvo需要runtime动态生成类

kvo应用场景

MJRefresh

如何查看runtime重新生成的kvo新类是重写了哪些方法?

- (void)viewDidLoad {
    [super viewDidLoad];
    self.studentObj1 = [[Student alloc] init];
        self.studentObj2 = [[Student alloc] init];
        
        NSKeyValueObservingOptions options = NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld;
        [self.studentObj1 addObserver:self forKeyPath:@"name" options:options context:nil];
        
        [self printMethodNameWithClass:object_getClass(self.studentObj1)];
        
        [self printMethodNameWithClass:object_getClass(self.studentObj2)];
}
    
// 打印类中的方法  
- (void)printMethodNameWithClass:(Class)class {
    NSMutableString *methodNames = [NSMutableString string];
    unsigned int count;
    Method *methodList = class_copyMethodList(class, &count);
    for (int i = 0; i < count; i++) {
        Method method = methodList[i];
        NSString *methodName = NSStringFromSelector(method_getName(method));
        [methodNames appendFormat:@"%@ ",methodName];
    }
    free(methodList);
    NSLog(@"className%s - allMethodName%@",class_getName(class),methodNames);
}

// 打印结果
2020-12-23 12:09:31.447274+0800 FiftyTwo[12958:724869] classNameNSKVONotifying_Student - allMethodNamesetName: class dealloc _isKVOA
2020-12-23 12:09:31.447466+0800 FiftyTwo[12958:724869] classNameStudent - allMethodName.cxx_destruct name setName:

响应式编程和kvo的区别

kvo的本质描述

利用runtime,动态生成一个子类NSKVONotifying_Class,并让instance实例指向这个子类,当修改instance对象的属性时,会调用Foundation的NSSetIntValueAndNotify函数,
NSSetIntValueAndNotify函数代码如下

- (void)setName:(NSString *)name {
        _NSSetIntValueAndNofify();
    }
    
    void _NSSetIntValueAndNofify() {
        [self willChangeValueForKey:@"name"];
        [super setName:@"name"];
        [self didChangeValueForKey:@"name"];
    }
    
    - (void)didChangeValueForKey:(NSString *)key {
        [observe observeValueForKeyPath:key ofObject:self change:change context:change];
    }

如何手动出发kvo

如此便可触发kvo
[self.studentObj1 willChangeValueForKey:@"name"];
[self.studentObj1 didChangeValueForKey:@"name"];

相关文章

  • 聊一聊KVO

    kvo具体的实现过程 1.首先只能作用于属性2.要注册观察者 注册观察者之后,instance对象有什么变化? 同...

  • 顺便聊一聊KVO实现思路

    和其它文章不同的是,我侧重写一些技术方面实现当中的思路。 那么现在切到正题。我们iOS实现KVO的时候,要有怎么个...

  • 聊一聊

    就是这样,喜欢自我欺骗,明知道,真心想你,或者有事的人,会打电话给你。却还是忍不住的用微信,看一个人的消息和动态,...

  • 聊一聊

    记录一下,现在是女儿的生日。2020.7.25星期六 生日快乐我的小天使 微淼商学院说过最经典的话是:有些做商学院...

  • 聊一聊

    早在三天前师兄就告知我们今天上午老师会和我们在实验室聊一聊。校园卡余额不足,时间紧张未吃早餐,早上慌忙收拾赶紧到实...

  • 聊一聊

    大家好,我是野生梅花鹿。 马上就12点了,我决定用几分钟的时间随便写点啥~ 首先呢,是反省。 这个月,其实懒惰了很...

  • 聊一聊

    很久没写了,聊聊最近发生的事,十月份开始了一段长板之旅,一开始担心害怕摔,因为通过挑战一个个动作,挺有趣的,当你为...

  • 聊一聊

    疫情这些年,常常听到的是,哪哪被封控了之类,作为天选打工人,一直在正常上班搬砖中。 直至上周五晚接...

  • KVO 实现容器类观察

    我们一般会使用kvo来观察某一个对象的非容器属性,很少使用kvo来观察一个容器类,今天就和大家聊一下kvo对容器类...

  • 聊一聊自律

    很久以前就知道韩雪,当时只觉得她是气质很优雅,长得很美丽的女明星,没有什么特殊的感觉,应该就是花瓶而已。 她的才气...

网友评论

      本文标题:聊一聊KVO

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