MVC\MVO 机制
刚开始看到mvc和mvo时已经接触iphone编程有段时间了,由于在学校自学,进程缓慢.好了废话少说,在网上看了很多关于mvc\mvo的文章,感觉一片迷茫,看了MatrixHero的一篇博文思路才稍感清晰。
简单的说mvc就是一种间接访问对象属性的机制,例如我们有个student类,类中有name属性.我们一般访问的方法可能是student.name=@"name"; 如果是kvc方式则要用[student valueForKey:@"name"];
总结下kvc的实现:
获取属性值时可以通过valueForKey:的方法,设置属性值用setValue:forKey:。与此同时,KVC还对未定义的属性值定义了 valueForUndefinedKey:,假如给出的字符串没有对象的属性 会访问valueForUndefineKey方法 默认实现是raise 一个异常 但你可以重写这个方法你可以重载以获取你要的实现
kvo 就是一个在语言框架层面实现的观察者模式 通过kvc的方式修改属性时(这点不是很明确),会主动通知观察者。其实现如下:
1 注册观察者:
keyPath就是要观察的属性值,options给你观察键值变化的选择,而context方便传输你需要的数据(注意这是一个void型)
2 实现变化方法:
change:(NSDictionary *)change context:(void*)context
change里存储了一些变化的数据,比如变化前的数据,变化后的数据;如果注册时context不为空,这里context就能接收到。
以下为MatrixHero提供的一个例子.亲测可行
例子
person类
@implementation Person
@synthesize name,age;
-(void) changeName{
name=@"changeName directly";
}
@end
PersonMonitor类 监视了name属性
@implementation PersonMonitor
- (void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary *)change
context:(void *)context
{
if ([keyPath isEqual:@"name"]) {
NSLog(@"change happen, old:%@ new:%@",[change objectForKey:NSKeyValueChangeOldKey],[change objectForKey:NSKeyValueChangeNewKey]);
}
}
@end
测试代码
Person *p =[[Person alloc] init];
PersonMonitor *pm= [[PersonMonitor alloc]init];
[p addObserver:pm forKeyPath:@"name" options:(NSKeyValueObservingOptionNew |
NSKeyValueObservingOptionOld) context:nil];
NSLog(@"p.name is %@",p.name);
[p setValue:@"name kvc" forKey:@"name"];
NSLog(@"p name get by kvc is %@",[p valueForKey:@"name"]);
p.name=@"name change by .name=";
[p changeName]; //can't be notify
输出
2011-07-03 16:35:57.406 Cocoa[13970:903] p.name is name
2011-07-03 16:35:57.418 Cocoa[13970:903] change happen, old:name new:name kvc
2011-07-03 16:35:57.420 Cocoa[13970:903] p name get by kvc is name kvc
2011-07-03 16:35:57.421 Cocoa[13970:903] change happen, old:name kvc new:name change by .name=//这里我不认为是采用了mvc模式更改属性,但观察者仍然接到了通知(很困惑)
最后一次修改是直接修改 所以没法产生通知
MVC\MVO 机制相关推荐
- php mvc例子,PHP_ThinkPHP的MVC开发机制实例解析,ThinkPHP是目前国内应用非常广 - phpStudy...
ThinkPHP的MVC开发机制实例解析 ThinkPHP是目前国内应用非常广泛的一款MVC开发框架.本文就以实例形式解析ThinkPHP的MVC开发机制.相信会给大家一定的启发作用.具体分析如下: ...
- asp.net MVC 路由机制 Route
1:ASP.NET的路由机制主要有两种用途: -->1:匹配请求的Url,将这些请求映射到控制器 -->2:选择一个匹配的路由,构造出一个Url 2:ASP.NET路由机制与URL重写的区 ...
- java 自省_java spring mvc 自省机制填充
jsp页面 pageEncoding="UTF-8"%> //JSP页面 录入页面 姓名: 生日: value="" /> (日期格式:yyyy-M ...
- 自己动手写一个简单的MVC框架(第二版)
一.ASP.NET MVC核心机制回顾 在ASP.NET MVC中,最核心的当属"路由系统",而路由系统的核心则源于一个强大的System.Web.Routing.dll组件. 在 ...
- Asp.Net MVC 3【URLs, Routing,and Areas】续
http://www.cnblogs.com/HuiTai/archive/2012/07/24/2597875.html 接着前面继续学习分享我们的路由. 现在我们把Global.asax文件里的R ...
- Spring MVC 源码分析
根据上面分析的Spring MVC 工作机制,从三个部分来分析Spring MVC 的源代码. 其一,ApplicationContext 初始化时用Map 保存所有url 和Controller 类 ...
- C#WebApi路由机制详解
随着前后端分离的大热,WebApi在项目中的作用也是越来越重要,可单独部署.与前端和App交互都很方便,既然有良好的发展趋势,我们当然应该顺势而为--搞懂WebApi!Restful相当于给Http请 ...
- Node mysql mvc vue_net MVC +Vue.js+Element UI 笔记
最近项目需求,要在MVC里用Vue 与 Element UI,故而做个笔记来记录一些遇到的问题和处理思路 (方式比较麻瓜,如果不是临时用的话,建议还是学一下Vue-cli,新项目还是老老实实前后端分离 ...
- MVC简单实现插件Demo-从底层理解MVC路由匹配浏览器请求的URL
今天实现了在mvc平台下自定义插件,虽然功能比较简单,但是通过对反射的运用,更加明白了为什么我们在浏览器上输入友好的url时,mvc会智能的帮我们找到我们想要查找的页面呢?mvc在底层又是怎样实现的呢 ...
最新文章
- 为什么添加Web引用后,客户端就能远程调用WebService了?
- 2022.3.26八仙花
- 微信小程序傻瓜制作_盘点:微信小程序制作平台有哪些
- Spring 3.1缓存和配置
- 程序员要如何学英语?
- C++ 工厂模式(设计模式)
- 怎么让图片居中php,怎么让CSS文件里图片居中
- 技术选型都做不好,难怪自动化做得这么费力...
- UITextFiled和UITextView限制字数和输入特殊字符的总结
- 细说GIT分布式版本控制器
- oracle查询语句大全 oracle 基本命令大全
- xshell过期/安装教程
- java 分布式日志_打造分布式日志收集系统
- 计算机视觉教程0-2:你了解眼里所见的色彩吗?(详解RGB/HSV/Lab)
- 高性能的计算机至少有几个cpu,感觉PC对CPU的性能需求快到极限了
- win10下配置maven
- C#编写一个简单串口通讯上位机
- PDF如何修改编辑文字?两种简单的方法分享给大家
- 服务器主板四路SLI时候出现的问题
- 腾讯前端常考面试题汇总