IOS 开发之 KVO和KVC 模式的简单使用

- (void)viewDidLoad {

[super viewDidLoad];

// Do any additional setup after loading the view, typically from a nib.

//1.KVC的使用

//  Key Value Coding的缩写, 表示键值编码

//作用:  通过字符串标示的方式访问对象的property和实例变量

//项目中使用:    使用KVC实现JSON中字典到model的转换

Car *car = [[Car alloc] init];

car.type = @"BMW";

car.speed = 250;

NSLog(@"type = %@,speed=%f",car.type,car.speed);

//kvc 访问属性一种方式(特殊使用字符串做key)

//key: 属性名可以做key, 实例变量名也可以做key

[car setValue:@"Mini" forKey:@"type"];

NSLog(@"type=%@",[car valueForKey:@"type"]);

//修改基本类型, 传入的是 NSNumber

[car setValue:@(100) forKey:@"speed"];

NSLog(@"speed = %f",[[car valueForKey:@"speed"] doubleValue]);

[car setValue:@(3.14) forKey:@"_num"];

[car show];

//注意: 如果key不存在, 则抛出异常

//解决:   重新实现 setValue:forUndefinedKey:

//1.2 KeyPath的使用

Engine *engine = [[Engine alloc] init];

car.engine = engine;

//设置car的engine的power属性

[car setValue:@(300) forKeyPath:@"engine.power"];

NSLog(@"power = %f",[[car valueForKeyPath:@"engine.power"] doubleValue]);

//1.3 字典和对象转化

NSDictionary *carDict = @{@"type":@"QQ",

@"speed":@"180"};

[car setValuesForKeysWithDictionary:carDict];

NSLog(@"type = %@,speed=%f",car.type,car.speed);

//2.KVO的使用

// Key Value Observer 键值监听

//作用: 监控某个对象的某个属性的变化

//实例: 车对象, 它的speed属性变化了, 仪表盘显示速度

newCar = [[Car alloc] init];

newCar.speed = 0;

//监控

//作用: 一旦speed变化了, 执行self中指定方法

[newCar addObserver:self forKeyPath:@"speed" options:NSKeyValueObservingOptionOld|NSKeyValueObservingOptionNew context:nil];

//模拟启动

newCar.speed = 50;

newCar.speed = 100;

newCar.speed = 120;

newCar.speed = 120;

newCar.speed = 120;

}

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context

{

static double preSpeed = 0;

//显示新的速度

double speed = [[object valueForKeyPath:keyPath] doubleValue];

if(preSpeed != speed)

{

NSLog(@"speed = %f",speed);

}

preSpeed = speed;

}

-(void)dealloc

{

[newCar removeObserver:self forKeyPath:@"speed"];

}

时间: 2024-12-06 08:18:56

IOS 开发之 KVO和KVC 模式的简单使用的相关文章

iOS开发之KVO机制的妙用

压抑不住激动得心情,趁着今天时间多,我就全部拿来写博客好了,当然,不吹牛逼了.吹多了,写不出来代码怎么办呢. 前言:还记得当我接到自己第一个项目的时候,首页的collectionview的frame一直定不好,总会出现collectionview太大了,或者底层的scrollview的contentsize太小了.这些通过小调frame都可以实现不会挡住.但是,后来当客户提出要加上热卖推荐字段的时候 我就懵了.怎么来实现呢,还要保证在collectionview底部有------END-----

IOS开发之Bug--使用KVC的易错情况

1.其实某些角度而言KVC是一个破坏封装又暴力的做法,而我已经两次因为KVC而导致应用程序出现闪退的情况. 场景:1.使用KVC修改某一个UIView的属性,比如width.    2.在viewWillAppear使用上面的第1步. 结果:应用程序闪退. 原因:视图的UI还没创建和加载,KVC就对其进行强制赋值操作.空对象无法操作,所以闪退或者崩溃.

iOS 开发之Target-action模式

Target-action:目标-动作模式,它贯穿于iOS开发始终.但是对于初学者来说,还是被这种模式搞得一头雾水. 其实Target-action模式很简单,就是当某个事件发生时,调用那个对象中的那个方法.如:按下按钮时,调用Controller里边的click方法.“那个对象”就是Target,“那个方法”就是Action,及Controller是Targer,click方法是action. 一般Target都是Controller,而Action有它自己固有的格式:-(IBAction)c

李洪强iOS开发之RunLoop的原理和核心机制

李洪强iOS开发之RunLoop的原理和核心机制 搞iOS之后一直没有深入研究过RunLoop,非常的惭愧.刚好前一阵子负责性能优化项目,需要利用RunLoop做性能优化和性能检测,趁着这个机会深入研究了RunLoop的原理和特性. RunLoop的定义 当有持续的异步任务需求时,我们会创建一个独立的生命周期可控的线程.RunLoop就是控制线程生命周期并接收事件进行处理的机制. RunLoop是iOS事件响应与任务处理最核心的机制,它贯穿iOS整个系统. Foundation: NSRunLo

李洪强IOS开发之-iOS经典面试题

李洪强IOS开发之-iOS经典面试题 写这篇文章的目的是因为前两天同学想应聘iOS开发,从网上找了iOS面试题和答案让我帮忙看看.我扫了一眼,倒吸了一口冷气,仔细一看,气的发抖.整篇题目30多个没有一个答案是对的,总结这篇面试题的作者对iOS机制根本就是一知半解就敢发到网上,不管有心还是无心都是坑害新人.所以在这里总结一下这几年面试别人和被别人面试遇到的一些我认为比较好的基础题目分享给大家,进阶题目在后续补充.我的理解如果有错漏请一定指出,非常感谢! 从12年开始做面试官到现在已经三个年头了,这

iOS开发之MVVM在项目中的应用

今天写这篇博客是想达到抛砖引玉的作用,想与大家交流一下思想,相互学习,博文中有不足之处还望大家批评指正.本篇博客的内容沿袭以往博客的风格,也是以干货为主,偶尔扯扯咸蛋(哈哈~不好好工作又开始发表博客啦~). 由于本人项目经验有限,关于架构设计方面的东西理解有限,我个人对MVVM的理解主要是借鉴于之前的用过的MVC的Web框架~在学校的时候用过ThinkPHP框架,和SSH框架,都是MVC的架构模式,今天MVVM与传统的MVC可谓是极为相似,也可以说是兄弟关系,也就是一家人了. 说到架构设计和团队

iOS开发之Socket通信实战--Request请求数据包编码模块

实际上在iOS很多应用开发中,大部分用的网络通信都是http/https协议,除非有特殊的需求会用到Socket网络协议进行网络数 据传输,这时候在iOS客户端就需要很好的第三方CocoaAsyncSocket来进行长连接连接和传输数据,该第三方地 址:https://github.com/robbiehanson/CocoaAsyncSocket,读者可以自行google或者baidu搜索 这个库的用法,网上有很多资料,而且用法不难. 在一些对Socket通信使用需求不是很高的应用中,比如需要

【IOS开发之Objective-C】协议和代理

在现实生活中我们存在各种各样的协议,但是都有一个共同点,就是拟定的协议,就要遵守,不遵守就是违约.在OC中也有协议这一个概念而且和我们现实生活中的协议的特点是类似的.有时我们自己想做什么事,但是现在没这个能力自己去做,亲力亲为,我们就需要找代理来帮我们做了.那么在OC中也有代理这个概念.下面就简单的说说OC中的协议和代理. 一.协议 在<[IOS开发之Objective-C]对象的交互>中实现了一种对象的交互的方式.在OC中还有其他方式,比如说协议,在OC中用协议来规范接口,是实现对象之间的交

IOS开发之copy的问题

copy的目的就是修改副本,修改原始对象和副本时不会产生干扰. 定义一个不可变属性A,再定义一个可变属性B.用B做添加删除等操作后再将B赋值给A时,有些人习惯用A = B:其实这样是不安全的. 假设有下面的一段代码: ? 1 2 3 4 5 6 7 8 9 10   int main() {    NSMutableString *strM = [NSMutableString [email protected]"123"];    NSString *str = strM;    N