KVC:Key-Value Coding

KVO:Key-Value Observing

Person.m

#import <Foundation/Foundation.h>

@interface Person : NSObject{
//该访问修饰符用于说明即使私有成员变量也可以通过kvc方式访问和赋值
@private
NSString *_name;
NSArray *_dogs;
}
@end @implementation Person
@end

Dog.m

#import <Foundation/Foundation.h>

@class Person;

@interface Dog : NSObject
{
@private
NSInteger _age;
Person *_owner;
}
@end @implementation Dog
@end

PersonObserve.m

#import <Foundation/Foundation.h>
#import "Person.h" @interface PersonObserve : NSObject
@end @implementation PersonObserve
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{
Person *p = (Person *)object;
//使用kvc方式获取成员变量keypath的值
NSLog(@"%@",[p valueForKey:keyPath]);
}
@end

main.m

#import <Foundation/Foundation.h>
#import "Person.h"
#import "PersonObserve.h"
#import "Dog.h" int main(int argc, const char * argv[]) {
//观察者类
PersonObserve *po = [[PersonObserve alloc] init];
Person *p = [[Person alloc] init];
//使用kvo方式对成员变量“name”的属性值变化增加观察者po
//po将在该属性值发生变化时执行- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context方法
[p addObserver:po forKeyPath:@"name" options:NSKeyValueObservingOptionNew context:nil]; //通过kvc方式设置成员变量“name”的属性值
//触发观察者执行对应方法
[p setValue:@"zhangsan" forKey:@"name"]; //kvc中forKeyPath的用法
Dog *d = [[Dog alloc] init];
[d setValue:p forKey:@"owner"];
[d setValue:@"lisi" forKeyPath:@"owner.name"]; //移除对私有成员变量“name”的观察
[p removeObserver:po forKeyPath:@"name"]; Dog *d1 = [[Dog alloc] init];
[d1 setValue:@ forKey:@"age"];
Dog *d2 = [[Dog alloc] init];
[d2 setValue:@ forKey:@"age"]; NSArray *array = [NSArray arrayWithObjects:d1,d2, nil];
[p setValue:array forKey:@"dogs"]; //kvc中valueForKeyPath数组内置表达式的用法
NSLog(@"dogs.age = %@",[p valueForKeyPath:@"dogs.age"]);
NSLog(@"dogs.age.sum = %@",[p valueForKeyPath:@"dogs.@sum.age"]);//dogs数组中age的总和
NSLog(@"dogs.age.avg = %@",[p valueForKeyPath:@"dogs.@avg.age"]);//dogs数组中age的平均值
NSLog(@"dogs.age.max = %@",[p valueForKeyPath:@"dogs.@max.age"]);//dogs数组中age的最大值
NSLog(@"dogs.age.min = %@",[p valueForKeyPath:@"dogs.@min.age"]);//dogs数组中age的最小值 return ;
}

结果:

-- ::34.611 KVC&KOC[:] zhangsan
-- ::34.612 KVC&KOC[:] lisi
-- ::34.613 KVC&KOC[:] dogs.age = (
, )
-- ::34.613 KVC&KOC[:] dogs.age.sum =
-- ::34.613 KVC&KOC[:] dogs.age.avg =
-- ::34.613 KVC&KOC[:] dogs.age.max =
-- ::34.613 KVC&KOC[:] dogs.age.min =
Program ended with exit code:

IOS开发之KVC与KVO简述的更多相关文章

  1. IOS开发之KVC KVO KVB

    KVC(Key Value Coding) KVO(Key Value Observing) KVB(Key Value Binding) KVO是Cocoa的一个重要机制,他提供了观察某一属性变化的 ...

  2. iOS开发之KVC全解

    一  KVC的基本概念 1.KVC是Key Value Coding的缩写,意思是键值编码. 在iOS中,提供了一种方法通过使用属性的名称(也就是Key)来间接访问对象属性的方法,这个方法可以不通过g ...

  3. iOS开发之KVC

    1.KVC概述 KVC(Key-value coding)是一套利用字符串标识符间接访问对象属性和关系的机制.Cocoa Programming中,Core Data,Application Scri ...

  4. iOS 开发之 KVC - setValuesForKeysWithDictionary 解析

    从字典映射到一个对象,这是KVC中的一个方法所提供的,这个方法就是 setValuesForKeysWithDictionary:,非常好用,不需要你来一一的给对象赋值而直接从字典初始化即可,但用的不 ...

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

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

  6. 李洪强iOS开发之iOS社区收集

    李洪强iOS开发之iOS社区收集 项目 简述 github 全球最大的代码仓库,无论是iOS开发还是Android开发没有人不知道这个网站,它也是一个社区,你可以去follow(关注)某些人或公司. ...

  7. 李洪强iOS开发之iOS工具收集

    李洪强iOS开发之iOS工具收集 项目 简述 日期 我是怎么慢慢变懒的 : Jenkins + 蒲公英 使用Jenkins + 蒲公英使得项目打包给测试人员自动化,大大节省了劳动力 2015.04.1 ...

  8. 李洪强iOS开发之iOS学习方法收集

    李洪强iOS开发之iOS学习方法收集 在这里收集一些iOS学习方法,会不断更新 项目 简述 日期 一年多iOS开发总结 作者总结了自己一年多的iOS学习经验,对于iOS初学者来说很多地方是可以借鉴的 ...

  9. 李洪强iOS开发之iOS好文章收集

    李洪强iOS开发之iOS好文章收集 该文收集朋友们转发或自己的写的技术文章,如果你也有相关的好文章,欢迎留言,当好文章多的时候,我会对这些好文章进行分门别类 文章 简述 日期 直播服务配置 使用 ng ...

随机推荐

  1. [洛谷2397]yyy loves Maths VI

    题目背景 自动上次redbag用加法好好的刁难过了yyy同学以后,yyy十分愤怒.他还击给了redbag一题,但是这题他惊讶的发现自己居然也不会,所以只好找你 题目描述 他让redbag找众数他还特意 ...

  2. 华为过滤字符串(java)

    /*通过键盘输入一串小写字母(a~z)组成的字符串.请编写一个字符串过滤程序,若字符串中出现多个相同的字符,将非首次出现的字符过滤掉.比如字符串“abacacde”过滤结果为“abcde”.要求实现函 ...

  3. HDU 4135 Co-prime

    思路:直接用求(b,1)范围内互质的数,(a-1,1)范围内互质的数.再求反 就是敲一下容斥模板 #include<cstdio> #include<cstring> #inc ...

  4. 6个WordPress备份插件

    毫无疑问,为了保证网站的数据安全,经常备份是非常有必要的,当然手动备份比较麻烦,所以很多时候我们会使用WordPress的备份插件.Jackie Hole的<6 Top WordPress Ba ...

  5. HW2.1

    import java.util.Scanner; public class Solution { public static void main(String[] args) { Scanner i ...

  6. Sitemap Editors for Dynamics CRM 2013

    I’ve started using a couple of different sitemap editors in my projects for CRM 2013. These tools he ...

  7. __attribute__ ((__section__ (".init.text")))

    在kernel中有很多__init,这个东东到底是何方神圣捏?且听小生我一一道来.下面是其定义:file:/include/linux/init.h 43 #define __init      __ ...

  8. dedecms 常用标签

    都是常用的一些标签,大家可以用ctrl+F实现搜索. 网站名称:{dede:global.cfg_webname/} 网站根网址:{dede:global.cfg_basehost/} 网站根目录:{ ...

  9. Java 随机生成中文姓名,手机号,邮编,住址

    package lovo; import java.util.HashMap; import java.util.Map; /** * 随机生成中文姓名,性别,Email,手机号,住址 * @auth ...

  10. hdu 1050 Moving Tables

    http://acm.hdu.edu.cn/showproblem.php?pid=1050 这个题我首先直接用的常规贪心,用的和那个尽可能看更多完整节目那种思路.但是.......一直WA....T ...