美文网首页
iOS触发KVO问题

iOS触发KVO问题

作者: 程序员学哥 | 来源:发表于2021-01-26 00:10 被阅读0次

现在有一个XGPerson对象

@interface XGPerson : NSObject
@property (copy, nonatomic) NSString *name;
@end

通过KVO对XGPerson的name属性监听以后,分别执行下面的代码

  • 外面设置name
    // 1
    _person.name = @"程序员学哥";
    // 2
    [_person setValue:@"程序员学哥" forKey:@"name"];
    // 3
    [_person setValue:@"程序员学哥" forKey:@"_name"];

  • 内部设置name
    // 4
    self.name = @"程序员学哥";
    // 5
    _name = @"程序员学哥";
    // 6
    [self setValue:@"程序员学哥" forKey:@"name"];
    // 7
    [self setValue:@"程序员学哥" forKey:@"_name"];

  • runtime设置name
    unsigned int outCount = 0;
    Ivar *ivars = class_copyIvarList([Person class], &outCount);
    for (int i = 0; i < outCount; i++) {
        Ivar ivar = ivars[i];
        if ([[NSString stringWithUTF8String:ivar_getName(ivar)] isEqualToString:@"_name"]) {
        // 8
            object_setIvar(_person, ivar, @"程序员学哥");
        }
    }

结果:1、2、4、6会触发监听,而3、5、7、8不会触发。

原因:KVO的本质是通过isa-swizzling新建了一个子类,并且重写了属性的setter方法,在setter方法的头和尾分别执行了willChangeValueForKey:didChangevlueForKey:两个方法来实现监听的。

image

因为1、2、4、6会走setter方法,而3、5、7、8直接设置name属性,并没有走setter方法,所以无法触发监听。

拓展

1:KVC 触发KVO
我们在使用KVC时,key加不加_决定了是否走setter方法。
2:KVO监听数组的变化
正常KVO监听数组时,即使我们修改了数组的内容(这里指修改数组内部的内容-增删改)因为没有触发setter方法所以不会触发监听,最简单的就是加一句self.arr = self.arr就可以触发监听了。

相关文章

  • 认识KVO

    问题KVO的本质是什么?(iOS用什么方式实现对一个对象的KVO?)如何手动触发KVO?直接修改成员变量会触发KV...

  • iOS底层原理汇 - 探索KVO本质

    问题 iOS用什么方式实现对一个对象的KVO?(KVO的本质是什么?) 如何手动触发KVO ? 首先需要了解KVO...

  • KVO的本质

    面试问题: iOS用什么方式实现对一个对象的KVO? 如何手动触发KVO? KVO简介 KVO就是键值观测。有时候...

  • IOS基础知识-KVO原理篇

    问题 iOS用什么方式实现对一个对象的KVO?(KVO的本质是什么?)如何手动触发KVO KVO的全称 Key-V...

  • KVO和KVC的本质

    一、KVO 问题 iOS用什么方式实现对一个对象的KVO?(KVO的本质是什么?) 如何手动触发KVO? 1. K...

  • iOS触发KVO问题

    现在有一个XGPerson对象 通过KVO对XGPerson的name属性监听以后,分别执行下面的代码 外面设置n...

  • iOS底层原理总结 - 探寻KVO本质

    问题iOS用什么方式实现对一个对象的KVO?(KVO的本质是什么?)如何手动触发KVO 首先需要了解KVO基本使用...

  • KVO

    iOS用什么方式实现对一个对象的KVO 如何手动触发KVO 直接修改成员变量会触发KVO么? KVO [self....

  • iOS开发-底层原理 - KVO

    问题:iOS用什么方式实现对一个对象的KVO?(KVO的本质是什么?)如何手动触发KVO? 一.基本使用 概念:K...

  • 深入理解KVO

    iOS | KVO | Objective-C KVO的本质是什么,如何手动触发KVO? 1.什么是KVO KVO...

网友评论

      本文标题:iOS触发KVO问题

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