Key-Value Coding (KVC)
Key-Value Coding (KVC)
KVC,即是指 NSKeyValueCoding,一个非正式的 Protocol,提供一种机制来间接访问对象的属性。KVO 就是基于 KVC 实现的关键技术之一。
一个对象拥有某些属性。比如说,一个 Person 对象有一个 name 和一个 address 属性。以 KVC 说法,Person 对象分别有一个 value 对应他的 name 和 address 的 key。 key 只是一个字符串,它对应的值可以是任意类型的对象。从最基础的层次上看,KVC 有两个方法:一个是设置 key 的值,另一个是获取 key 的值。
// 重写setter方法和getter 方法:
1. Dog对象有属性:
@property(nonatomic,copy)NSString *name;
2. 如果同时重写setter和getter方法:
// 记住: 如果同时重写setter和getter方法,系统不会自动生成_name的成员变量.
需要  @synthesize name = _name;
以告诉系统,你要帮我生成_name 
3.  [myDog setValue:@"MBXxx" forKey:@"_name"];
@“_name” @“name” 都可以访问到该成员变量
4.  NSString *age = [myDog valueForKey:@"age"];
调用这句代码时,
1) 系统先去找该变量有没有getter方法. 如果有,调用getter方法取值
2) 如果没有getter方法,系统会查找有没有age成员或者_age成员.
5. 如果仅仅在.m文件中声明了全局的变量:
{
    @public
NSString *age;
}
这时,只能通过KVC模式来赋值和取值.
// 注: 先赋值,再取.
[myDog setValue:@"10" forKey:@"age"];
        NSString *age = [myDog valueForKey:@"age"];
NSLog(@"age ==== %@",age);
打印结果: age === 10
说明,赋值和取值过程成功.

KVO:
即:Key-Value Observing,它提供一种机制,当指定的对象的属性被修改后,则对象就会接受到通知。简单的说就是每次指定的被观察的对象的属性被修改后,KVO就会自动通知相应的观察者了。
// dog.m 代码:
#import "Dog.h"
@implementation Dog
{
    @public
NSString *age;
}
@synthesize name = _name;
-(void)setName:(NSString *)name{ // 1
NSLog(@"xxxxx");
_name = name;
}
-(NSString *)name{ // 2
    NSLog(@"AAAAA");
    return _name;
}
@end

person.m 代码:
#import "Person.h"
@implementation Person

-(void)setDog:(Dog *)dog{ // 3
    _dog = dog;
    // 添加当前对象为观察者
    [_dog addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:@"hello kvo"];
}
-(void)dealloc{ // 6
    [_dog removeObserver:self forKeyPath:@"name"];

}
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{ // 4
NSLog(@"context==%@",context);
if([object isKindOfClass:[Dog class]] && [keyPath isEqualToString:@"name"]){
NSString *new = change[NSKeyValueChangeNewKey];
        NSLog(@"new === %@",new);
    }
}
@end
下面看看调用过程是怎样的?
Person *p = [[Person alloc]init];
        p.dog = myDog;
myDog.name = @"fyz”; //5
1)调用 p.dog = myDog; 方法时,走 方法3.
2)然后来到 方法5
3)来到 方法2(getter) //打印了AAAA
4)然后 来到 方法1(setter) // 打印XXXX (这里为什么?需要测试)
5 ) 又来到 方法2( getter ) //打印了AAAA (这里又为什么?需要测试)
6 ) 然后来到 方法4 // 打印new ===
7 ) 最后走析构函数 方法6
// 没有加入观察者模式时,只会调一次 方法1(set方法),相当于观察者模式的存在.
先调用了一次getter方法, 再调一次setter方法,再调一次getter方法.

转载于:https://www.cnblogs.com/toxicanty/p/4453109.html

KVC/KVO 使用细节和调用顺序相关推荐

  1. Java代码块(代码块与静态代码块使用细节及调用顺序)

    目录 1.代码块的基本介绍 2.静态代码块 类什么时候加载[重点] 创建对象实例时(new) 创建子类对象实例时,父类也会被加载 使用类的静态成员时(静态属性,静态方法) 3.代码块的使用小细节 普通 ...

  2. zzz KVC/KVO原理详解及编程指南

    前言: 1.本文基本不讲KVC/KVO的用法,只结合网上的资料说说对这种技术的理解. 2.由于KVO内容较少,而且是以KVC为基础实现的,本文将着重介绍KVC部分. 一.简介 KVC/KVO是观察者模 ...

  3. KVC/KVO原理详解及编程指南

    作者:wangzz 原文地址:http://blog.csdn.net/wzzvictory/article/details/9674431 转载请注明出处 如果觉得文章对你有所帮助,请通过留言或关注 ...

  4. 必考题:子类继承父类,初始化以及方法调用顺序

    前言: 最近重投简历,一家公司的笔试题,就是子类继承父类,初始化顺序以及方法的调用顺序,很遗憾,我做错了.所以,记录在这里,希望以后不要再错. 程序: // 父类 public class Paren ...

  5. 对应用程序启动时所有方法的调用顺序分析

    一个应用程序的启动过程要包括代理的创建,控制器的加载和控制器view的加载,这其中有很多关于生命周期的方法,每个方法都是有先后顺序的,如果调用顺序拿不准,或者某段代码写的方法不恰当,就会遇到各种奇葩问 ...

  6. 验证异常处理调用顺序

    至个人年久失修的git博客搬运https://yusakul.github.io/ 验证异常处理调用顺序:VEH --> SEH --> VCH #include "stdafx ...

  7. Cpp 对象模型探索 / 带有虚继承类的构造函数的调用顺序

    栗子 #include <iostream> class A { public:A() { std::cout << "A" << std::e ...

  8. c++构造函数和析构函数的调用顺序研究

    构造函数与析构函数的调用顺序 构造函数与析构函数的调用顺序 构造函数与析构函数的调用顺序 1)当类中有成员变量是其它类的对象时,首先调用成员变量的构造函数,调用顺序与声明顺序相同:之后调用自身类的构造 ...

  9. 多继承中构造器和析构器的调用顺序

    多继承中构造器和析构器的调用顺序: 构造器的调用顺序就像盖房子,从最基层开始: 析构器的调用顺序就像拆房子,从最顶层开始:

最新文章

  1. 机房收费系统总结【3】-数据库细节
  2. 递归函数 集合 列表 元组
  3. 经典SQL(sqlServer)
  4. 简单使用SpringCloud的fegin和熔断hystrix
  5. Android 使用Listview的优化
  6. 几种简单的素数判定法(转)
  7. u-boot源码配置原理分析
  8. H5文件上传测试点,整理一波。
  9. 生产者与消费者 代码实现 java
  10. 基于IC设计的实用ISP介绍
  11. SASS的安装及简单操作
  12. 【Deepin】 Deepin 系统安装教程
  13. java做度量衡换算器_简易单位换算器_度量衡单位转换
  14. oracle修改sql域名,oracle更改数据库权限
  15. ipa文件反编译_iOS 逆向工程-反编译ipa包
  16. 2惠普暗影精灵恢复出厂设置
  17. Matlab关于画数据网格图
  18. vue中给字段base 64加密
  19. 追涨而不被套的4大绝招[转载]
  20. 七宗罪也许每个人都有

热门文章

  1. 小波变换 完美通俗讲解 之 二
  2. 关于浏览器和浏览器内核的解释
  3. java数据类型的一些注意事项
  4. 014_TimePicker时间选择器
  5. 013_Redis的主从模式
  6. 实验6Linux系统开发环境,哈工大嵌入式操作系统课件—6 Linux开发环境1-linux基.ppt...
  7. java检测tcp存活_keep-alive 和 TCP存活检测
  8. java求数列的最大子段和_天下无双的公考必考题 数量关系: 最值问题②(构造数列)...
  9. python随机生成车牌_使用Python自动化获取全国每个城市的车牌代码
  10. vue 后台返回的文件流进行预览_vue项目-pdf预览和下载,后台返回文件流形式