了解cocoa:Cocoa是苹果公司为Mac OS X所创建的原生面向对象的API,是Mac OS X上五大API之中的一个(其他四个是Carbon、POSIX、X11和Java)。

苹果的面向对象开发框架,用来生成 Mac OS X 的应用程序。基本的开发语言为 Objective-c, 一个c 的超集。

即为:Coroa 基本面向原生的API抽象。是C的一个超级。

在Cocoa中是以被万物之源NSObject类实现的NSKeyValueCoding(键值编码)/(键值观察)NSKeyValueObserving 非正式协议 的形式被定义为基础框架的一部分。

=
NSKeyValueCoding 是一个非正式的协议。(线管的内容能够看西面罗列的方法)

KVC/KVO实现的根本是Objective-C的 动态性和runtime
KVC/KVO机制离不开訪问器方法的实现。

kvc
相似c++中的map类的使用。
它提供了一种使用“字符串”而不是“訪问器(方法)”方法去訪问一个对象实例变量的机制。
kvo  
提供了一种当其他对象属性被改动的时候能通知当前对象的机制.
KVO机制非常适合实现model和controller类之间的通讯。

总结全部的方法差点儿能够使用以下的四个方法为代表。

//一般的都是这几个方法
<span style="color:#990000;">- (id)valueForKey:(NSString *)key;
- (void)setValue:(id)value forKey:(NSString *)key;</span>
Key——>键值 , 就是要訪问的属性名称(key)相应的字符串。 (用数组(索引)的方式似乎没有什么区别) <span style="color:#CC0000;">- (id)valueForKeyPath:(NSString *)keyPath;
- (void)setValue:(id)value forKeyPath:(NSString *)keyPath;</span>
后面的KeyPath是一个被点操作符隔开的用于訪问对象的指定属性的字符串序列。(keypath 就是大范围到小范围逐渐到详细的地方)
eg:eyPath address.street将会訪问消息接收对象所包括的address属性中包括的一个street属性。
事实上KeyPath说白了就是我们平时使用点操作訪问某个对象的属性时所写的那个字符串。

点语法和kvc之间的区别:
在实现了訪问器方法的类中,使用点语法和KVC訪问对象事实上区别不大,二者能够随意混用。可是没有訪问起方法的类中,点语法无法使用,这时KVC就有优势了。( 原因见第三部分的第一节:KVC怎样訪问属性值。

) ??

一对多的关系:(数据中常常会存在)
 ①间接操作
先通过KVC方法取到集合属性,然后通过集合属性操作集合中的元素。

 ②直接操作 (基本上是不适用)
 
 4、键值验证(Key-Value Validation)
KVC提供了验证Key相应的Value是否可用的方法:
- (BOOL)validateValue:(inout id *)ioValue forKey:(NSString *)inKey error:(out NSError **)outError;

该方法默认的实现是调用一个例如以下格式的方法:
- (BOOL)validate<Key>:error:

比方属性name相应的方法为:
-(BOOL)validateName:(id *)ioValue error:(NSError * __autoreleasing *)outError {
    return ;
}

KVC是不会自己主动调用键值验证方法的 。就是说我们须要手动验证。可是有些技术,比方CoreData会自己主动调用。

 5、KVC对数值和结构体型属性的支持

 总结一下,想使用KVO有三种方法:
1)使用了KVC
使用了KVC,假设有訪问器方法,则执行时会在訪问器方法中调用 will/didChangeValueForKey:方法;
没用訪问器方法,执行时会在setValue:forKey方法中调用 will/didChangeValueForKey:方法。

2)有訪问器方法
执行时会重写訪问器方法调用 will/didChangeValueForKey:方法。
因此,直接调用訪问器方法改变属性值时,KVO也能监听到。
3)显示调用will/didChangeValueForKey:方法。
总之。想使用KVO,仅仅要有 will/didChangeValueForKey:方法就能够了。

③ _isKVOA
这个私有方法预计是用来标示该类是一个 KVO 机制声称的类。

长处和缺点

1、长处
①能够再非常大程度上简化代码
样例网上非常多。这就不举了
②能跟脚本语言非常好的配合
才疏学浅,没学过AppleScript等脚本语言,所以没能深刻体会到该长处。
2、缺点
KVC的缺点不明显,基本的kvo的缺点如连接:http://www.mikeash.com/pyblog/key-value-observing-done-right.html
核心思想是说KVO的回调机制,不能传一个selector或者block作为回调。而必须重写-addObserver:forKeyPath:options:context:方法所引发的一系列问题。问了解决问题。作者还亲自实现了一个MAKVONotificationCenter类。代码见github:
https://github.com/mikeash/MAKVONotificationCenter
只是个人觉得这仅仅是苹果做的KVO不够完美,不能算是缺陷。

关于NSKeyValueCoding.h这个文件爱你的属性的了解。

#import <Foundation/NSArray.h>
#import <Foundation/NSDictionary.h>
#import <Foundation/NSOrderedSet.h>
#import <Foundation/NSSet.h> @class NSError, NSString; FOUNDATION_EXPORT NSString *const NSUndefinedKeyException;
FOUNDATION_EXPORT NSString *const NSAverageKeyValueOperator;
FOUNDATION_EXPORT NSString *const NSCountKeyValueOperator;
FOUNDATION_EXPORT NSString *const NSDistinctUnionOfArraysKeyValueOperator;
FOUNDATION_EXPORT NSString *const NSDistinctUnionOfObjectsKeyValueOperator;
FOUNDATION_EXPORT NSString *const NSDistinctUnionOfSetsKeyValueOperator;
FOUNDATION_EXPORT NSString *const NSMaximumKeyValueOperator;
FOUNDATION_EXPORT NSString *const NSMinimumKeyValueOperator;
FOUNDATION_EXPORT NSString *const NSSumKeyValueOperator;
FOUNDATION_EXPORT NSString *const NSUnionOfArraysKeyValueOperator;
FOUNDATION_EXPORT NSString *const NSUnionOfObjectsKeyValueOperator;
FOUNDATION_EXPORT NSString *const NSUnionOfSetsKeyValueOperator; @interface NSObject(NSKeyValueCoding) + (BOOL)accessInstanceVariablesDirectly;
- (id)valueForKey:(NSString *)key;
- (void)setValue:(id)value forKey:(NSString *)key;
- (BOOL)validateValue:(inout id *)ioValue forKey:(NSString *)inKey error:(out NSError **)outError;
- (NSMutableArray *)mutableArrayValueForKey:(NSString *)key;
- (NSMutableOrderedSet *)mutableOrderedSetValueForKey:(NSString *)key NS_AVAILABLE(10_7, 5_0);
- (NSMutableSet *)mutableSetValueForKey:(NSString *)key; - (id)valueForKeyPath:(NSString *)keyPath; //这个是有关路径的字符串。这个是怎么用的? - (void)setValue:(id)value forKeyPath:(NSString *)keyPath;
- (BOOL)validateValue:(inout id *)ioValue forKeyPath:(NSString *)inKeyPath error:(out NSError **)outError; - (NSMutableArray *)mutableArrayValueForKeyPath:(NSString *)keyPath;
- (NSMutableOrderedSet *)mutableOrderedSetValueForKeyPath:(NSString *)keyPath NS_AVAILABLE(10_7, 5_0);
- (NSMutableSet *)mutableSetValueForKeyPath:(NSString *)keyPath;
- (id)valueForUndefinedKey:(NSString *)key;
- (void)setValue:(id)value forUndefinedKey:(NSString *)key;
- (void)setNilValueForKey:(NSString *)key;
- (NSDictionary *)dictionaryWithValuesForKeys:(NSArray *)keys;
- (void)setValuesForKeysWithDictionary:(NSDictionary *)keyedValues;
@end //定的数组
@interface NSArray(NSKeyValueCoding)
- (id)valueForKey:(NSString *)key;
- (void)setValue:(id)value forKey:(NSString *)key;
@end //字典的两种方式进行组合
@interface NSDictionary(NSKeyValueCoding)
- (id)valueForKey:(NSString *)key;
@end
@interface NSMutableDictionary(NSKeyValueCoding)
- (void)setValue:(id)value forKey:(NSString *)key;
@end @interface NSOrderedSet(NSKeyValueCoding)
- (id)valueForKey:(NSString *)key;
- (void)setValue:(id)value forKey:(NSString *)key;
@end @interface NSSet(NSKeyValueCoding)
- (id)valueForKey:(NSString *)key;
- (void)setValue:(id)value forKey:(NSString *)key;
@end #if (TARGET_OS_MAC && !(TARGET_OS_EMBEDDED || TARGET_OS_IPHONE))
//TARGET_OS_EMBEDDED这个表示是嵌入式的方式
//TARGET_OS_IPHONE iphone 开发
//TARGET_OS_MAC os系统开发 @interface NSObject(NSDeprecatedKeyValueCoding)
+ (BOOL)useStoredAccessor ;
- (id)storedValueForKey:(NSString *)key ;
- (void)takeStoredValue:(id)value forKey:(NSString *)key;
- (void)takeValue:(id)value forKey:(NSString *)key ;
- (void)takeValue:(id)value forKeyPath:(NSString *)keyPath ;
- (id)handleQueryWithUnboundKey:(NSString *)key;
- (void)handleTakeValue:(id)value forUnboundKey:(NSString *)key;
- (void)unableToSetNilForKey:(NSString *)key;
- (NSDictionary *)valuesForKeys:(NSArray *)keys ;
- (void)takeValuesFromDictionary:(NSDictionary *)properties; @end
#endif

kvc和kvo的使用情况的了解的更多相关文章

  1. 【原】iOS中KVC和KVO的区别

    在iOS开发中经常会看到KVC和KVO这两个概念,比较可能混淆,特地区分一下 KVC(Key Value Coding) 1> 概述 KVC:Key Value Coding,键值编码,是一种间 ...

  2. iOS中关于KVC与KVO知识点

    iOS中关于KVC与KVO知识点 iOS中关于KVC与KVO知识点  一.简介 KVC/KVO是观察者模式的一种实现,在Cocoa中是以被万物之源NSObject类实现的NSKeyValueCodin ...

  3. [原创]obj-c编程15[Cocoa实例02]:KVC和KVO的实际运用

    原文链接:obj-c编程15[Cocoa实例02]:KVC和KVO的实际运用 我们在第16和第17篇中分别介绍了obj-c的KVC与KVO特性,当时举的例子比较fun,太抽象,貌似和实际不沾边哦.那么 ...

  4. iOS开发中KVC、KVO简介

    在iOS开发中,KVC和KVO是经常被用到的.可以使用KVC对对象的属性赋值和取得对象的属性值,可以使用KVO监听对象属性值的变化.简单介绍一下KVC和KVO. 一:键值编码(KVC) KVC,全称 ...

  5. obj-c编程15[Cocoa实例02]:KVC和KVO的实际运用

    我们在第16和第17篇中分别介绍了obj-c的KVC与KVO特性,当时举的例子比较fun,太抽象,貌似和实际不沾边哦.那么下面我们就用一个实际中的例子来看看KVC与KVO是如何运用的吧. 该例中用到了 ...

  6. Objective-C中的KVC与KVO(上)

    本文转载 李朴之先生博客 http://blog.csdn.net/pucker/article/details/7413280 Objective-C中的KVC与KVO是两种比较重要的技术,这里简要 ...

  7. 我所认为的KVC和KVO

    引子:    ​   为什么要写这个,只是突然一个念头闪现,说一下本人目前理解.KVC:    ​   Key-value coding,它是一种使用字符串标识符,间接访问对象属性的机制.但是关就这一 ...

  8. 11. KVC And KVO

    1. KVC And KVO  的认识 KVC/KVO是观察者模式的一种实现  KVC全称是Key-value coding,翻译成键值编码.顾名思义,在某种程度上跟map的关系匪浅.它提供了一种使用 ...

  9. iOS - 详细理解KVC与KVO

    详细理解KVC与KVO 在面试的时候,KVC与KVO有些时候还是会问到的,并且他们都是Objective C的关键概念,在这里我们先做一个简单地介绍: (一)KVC: KVC即指:NSKeyValue ...

随机推荐

  1. 机器学习——Day 1 数据预处理

    写在开头 由于某些原因开始了机器学习,为了更好的理解和深入的思考(记录)所以开始写博客. 学习教程来源于github的Avik-Jain的100-Days-Of-MLCode 英文版:https:// ...

  2. 计算某个时间段(2017-10-01 2017-12-01)内svn更新文件的MD5

    #!/bin/sh svn up svn log -v -r {$1}:{$2} | grep / | grep -v xxx | sort -f -u | uniq | awk -F 'xxxx' ...

  3. BZOJ 1975 k短路 A*

    思路: 直接上A* //By SiriusRen #include <queue> #include <cstdio> #include <cstring> #in ...

  4. POJ 1946 DP

    折腾了一晚上 明天再写.. 2016.5.17 23:59 -> -> #include <cstdio> #include <cstring> #include ...

  5. Unity引擎GUI之Image

    UGUI的Image等价于NGUI的Sprite组件,用于显示图片. 一.Image组件: Source Image(图像源):纹理格式为Sprite(2D and UI)的图片资源(导入图片后选择T ...

  6. DeltaFish 校园物资共享平台 第六次小组会议

    DeltaFish 校园物资共享平台 第六次小组会议 记录人:娄雨禛 2018.6.3 任务进度(2018.5.28-2018.6.3) 前端 李鑫:商品详情界面设计.总体配色分析 刘鼎乾:卖家页面初 ...

  7. 获取Json中特定的值

      假如我们得到了一个json的数据:json===>   {"Head":{"TransCode":"X1009","Tr ...

  8. HIVE 命令记录

    HIVE 命令记录 设置hive运行的队列 hive> set mapreduce.job.queuename=ven12; 打印列名 hive> set hive.cli.print.h ...

  9. OpenCV:OpenCV中的 parallel_for 和opencv parallel_for_

    OpenCV使用OMP完成并行运算,在使用AdaBoost检测的时候,在cascadedetect.cpp 里面,大量使用 parallel_for_(Range(0, stripCount), Ca ...

  10. TimerTask定时任务

    web.xml <listener> <listener-class>com.sign.listener.NFDFlightDataTaskListener</liste ...