美文网首页
笔记(三):KVC

笔记(三):KVC

作者: RBNote | 来源:发表于2018-07-23 10:56 被阅读14次
Knowledge is virtue while ignorance is evil. 知识即美德,无知即罪恶。
                                                     ---- 苏格拉底
3-1.KVC.png

一图胜千言

一 setValue:forKey:赋值原理

3-2KVC赋值原理.png

二 valueForkey:取值原理

3-3 kvc取值原理.png

三 :KVC修改属性是否会触发KVO?为什么?

创建一个命令行工程
//Person
@interface Person : NSObject
@property (nonatomic, assign) int age;
@end


#pragma mark - 为什么通过KVC进行赋值 会触发 KVO监听。
/**
 使用KVC 会触发下面两个方法。(手动触发KVO也是通过触发下面两个方法)
 - (void)willChangeValueForKey:(NSString *)key
 
 - (void)didChangeValueForKey:(NSString *)key
 
didChangeValueForKey 方法内部会调用监听器的方法。 属性值发生变化--->触发KVO
 */
- (void)willChangeValueForKey:(NSString *)key {
    [super willChangeValueForKey:key];
    NSLog(@"willChangeValueForKey ");
}


- (void)didChangeValueForKey:(NSString *)key {
    
    NSLog(@"didChangeValueForKey - begin");
    
    [super didChangeValueForKey:key];
    
    NSLog(@"didChangeValueForKey - end");
}


//监听者 RBObserver
@interface RBObserver : NSObject
@end

@implementation RBObserver
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context {
    
    NSLog(@"%@对象的%@属性发生的变化%@",object,keyPath,change);
}
@end



//main.m
#import "Person.h"
#import "RBObserver.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        
        Person *person = [[Person alloc] init];

        //添加KVO监听
        RBObserver *observer = [[RBObserver alloc] init];
        NSKeyValueObservingOptions options = NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew;
        [person addObserver:observer forKeyPath:@"age" options:options context:nil];
        
        //KVC赋值:是否会触发监听方法。
        [person setValue:@10 forKey:@"age"];
        NSLog(@"%d",person.age);
        
        //移除KVO监听
         [person removeObserver:observer forKeyPath:@"age"];
    }
    return 0;
}

也就说kvc内部会调用KVO的 willChangeValueForKey:和 didChangeValueForKey:方法(这个方法内部会调用监听者的监听方法。)
手动触发KVO也是通过这两个方法实现的。
这两个方法是NSObject(NSKeyValueObserverNotification) 分类里面的方法。


3-4KVO的willchangge 和didchange方法.png

本文代码可在github.com上查看。
LowLayerTheoryNote

相关文章

  • 笔记(三):KVC

    一图胜千言 一 setValue:forKey:赋值原理 二 valueForkey:取值原理 三 :KVC修改属...

  • iOS KVC

    OC底层学习笔记(4)-KVC - 简书

  • KVC、KVO的本质

    这篇文章介绍KVC、KVO的本质。如果你对KVC、KVO不了解,推荐先查看其用法:KVC和KVO学习笔记[http...

  • OC语法:KVC的底层实现

    一、KVC是什么二、怎么使用KVC三、KVC的底层实现四、KVC常见面试题 一、KVC是什么 KVC全称Key-V...

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

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

  • KVC 解析

    KVC解析(一) —— 基本了解KVC解析(二) —— 不可不知的赋值深层次原理KVC解析(三) —— 不可不知的...

  • KVC(三)

    接上: KVC(二) 接下来我们来看看 集合、集合操作符(集合作为属性)参考官网:Accessing Coll...

  • iOS KVC (十)模型转换

    iOS KVC(一)基本了解iOS KVC (二) 不可不知的赋值深层次原理iOS KVC (三)不可不知的取值...

  • iOS KVC (四)keyPath的深度解析

    iOS KVC(一)基本了解iOS KVC (二) 不可不知的赋值深层次原理iOS KVC (三)不可不知的取值...

  • iOS KVC (五)KVC几种典型的异常处理

    iOS KVC(一)基本了解iOS KVC (二) 不可不知的赋值深层次原理iOS KVC (三)不可不知的取值...

网友评论

      本文标题:笔记(三):KVC

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