美文网首页
iOS 的KVC和KVO

iOS 的KVC和KVO

作者: 小强简书 | 来源:发表于2018-01-18 19:22 被阅读16次

1.KVC(key value coding)

KVC:是使用字符串(键)访问一个对象实例变量的机制。而不是通过调用 Setter、Getter 方法等显式的存取方式去访问,用于监听属性值的变化。

总的来说共有三种方式:

1. 存值:[id setValue:value forKey:key];    取值:[id valueForKey:key];

给id对象的key属性赋值value。此处key的值一定必须要和在id对象key属性一模一样。

2. 存值:[id setValue:value forKeyPath:key.key];    取值:[id valueForKeyPath:key];

同样是给id对象的相应属性赋值,但此时后面将不再直接给出键,而是按照键值路径来查找出相应的键,系统会按『.』,自动进入对象内部,查找对象属性

    XQParent *parent2 = [[XQParent alloc] init];

    [parent2 setValue:dict[@"name"] forKeyPath:@"name"];

    XQChidren *chidren2 = [[XQChidren alloc] init];

    [parent2 setValue:chidren2 forKeyPath:@"children"];

    [chidren2 setValue:dict[@"children"][@"name"] forKeyPath:@"name"];

    NSLog(@"parent2.name:%@,parent2.chidren:%@ ,chidren2.name:%@",[parent2 valueForKeyPath:@"name"] ,[parent2 valueForKeyPath:@"children"],[chidren2 valueForKeyPath:@"name"]);

3.[id setValuesForKeysWithDictionary:NSDictionary];

上面的两种方式都需要取出来字典中的值,赋值给对象的相应属性。如果该对象要是有八九十来个属性,就要写八九十来行代码。这样太麻烦。碰到这样情况直接采用方式三便可。直接将整个字典作为参数传进来,便可将字典转化为model对象。

  XQParent *parent3 = [[XQParent alloc] init];

    [parent3 setValuesForKeysWithDictionary:dict];

    XQChidren *chidren3 = [[XQChidren alloc] init];

    [chidren3 setValuesForKeysWithDictionary:dict[@"children"]];

//    [parent3 setValue:chidren3 forKeyPath:@"children"];

    NSLog(@"parent3.name:%@,parent3.chidren:%@ ,chidren3.name:%@",[parent3 valueForKey:@"name"] ,[parent3 valueForKey:@"children"],[chidren3 valueForKey:@"name"]);

2.kvo key valued coding(键值编码)

kvo是 Objective-C 对观察者设计模式的一种实现,KVO 提供一种机制,指定一个被观察对象(例如 A 类),当对象某个属性(例如 A 中的字符串 name)发生更改时,对象会获得通知,并作出相应处理;【且不需要给被观察的对象添加任何额外代码,就能使用 KVO 机制】

kvo,简单来说就是系统动态创建一个新类NSKVONotifying_x,并且重写这个类的setter方法。

1.注册通知

[aProduct addObserver:selfforKeyPath:@"name"options:(NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld)                context:nil];

2.- (void)observeValueForKeyPath:(NSString*)keyPathofObject:(id)objectchange:(NSDictionary*)changecontext:(void*)context{if([keyPath isEqualToString:@"name"])    {NSString*newName = [change objectForKey:NSKeyValueChangeNew];                ...//通知响相应视图根据newName变量的值进行更新}}

如果 ,重写setter,同时允许KVO工作,需要再setter方法里:

- (void)setProductName:(NSString *)newProductName{

    [self willchangeValueForKey:@"productName"];

    productName = newProductName;

    [self didChangeValueForKey:@"productName"];

}

2. 一对多关系成员的情况

mutableArrayValueForKey:有序一对多关系成员  NSArray

[[self mutableArrayValueForKeyPath:@"numberMuArr"] addObject:numberStr];

mutableSetValueForKey:无序一对多关系成员  NSSet

[[self mutableArrayValueForKeyPath:@"numberMuArr"] removeLastObject];

相关文章

  • KVC 和 KVO

    iOS-KVC和KVO精炼讲解(干货)KVC 和 KVOiOS开发系列--Objective-C之KVC、KVO细...

  • 无标题文章

    ios中的 kvc和kvo的区别 KVC编程时setValue(value: AnyObje...

  • 知识点3

    26. 什么是KVC和KVO? KVO: iOS开发-KVO的奥秘 http://www.jianshu.com/...

  • KVC

    iOS 如何使用KVC iOS开发UI篇—Kvc简单介绍 iOS开发系列--Objective-C之KVC、KVO

  • iOS面试 - 收藏集 - 掘金

    KVC 与 KVO 拾遗补缺 - iOS - 掘金KVC 和 KVO 是 Cocoa 框架提供的一个非常强的特性,...

  • KVC

    KVC原理剖析 - CocoaChina_让移动开发更简单 iOS开发底层细究:KVC和KVO底层原理 | iOS...

  • iOS - KVO

    [toc] 参考 KVO KVC 【 iOS--KVO的实现原理与具体应用 】 【 IOS-详解KVO底层实现 】...

  • iOS-KVO浅谈

    上一篇:iOS-KVC浅谈 前言:KVO 作为 KVC 的同袍兄弟,功能更强大,聊聊 KVO。 一、KVO 简介 ...

  • 说一下KVC和KVO

    本篇采用简单的例子,来介绍 iOS 中的 KVC 和 KVO 的用法和实现原理。 一、KVC 1. KVC是什么 ...

  • KVC、KVO

    KVC、KVO探识(一)KVO和KVO的详细使用 KVC、KVO探识(二)KVC你不知道的东西 KVC、KVO探识...

网友评论

      本文标题:iOS 的KVC和KVO

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