刚开始看到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 注册观察者:

-(void)addObserver:(NSObject *)anObserver forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(void*)context

keyPath就是要观察的属性值,options给你观察键值变化的选择,而context方便传输你需要的数据(注意这是一个void型)

2 实现变化方法:

-(void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object
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 机制相关推荐

  1. php mvc例子,PHP_ThinkPHP的MVC开发机制实例解析,ThinkPHP是目前国内应用非常广 - phpStudy...

    ThinkPHP的MVC开发机制实例解析 ThinkPHP是目前国内应用非常广泛的一款MVC开发框架.本文就以实例形式解析ThinkPHP的MVC开发机制.相信会给大家一定的启发作用.具体分析如下: ...

  2. asp.net MVC 路由机制 Route

    1:ASP.NET的路由机制主要有两种用途: -->1:匹配请求的Url,将这些请求映射到控制器 -->2:选择一个匹配的路由,构造出一个Url 2:ASP.NET路由机制与URL重写的区 ...

  3. java 自省_java spring mvc 自省机制填充

    jsp页面 pageEncoding="UTF-8"%> //JSP页面 录入页面 姓名: 生日: value="" /> (日期格式:yyyy-M ...

  4. 自己动手写一个简单的MVC框架(第二版)

    一.ASP.NET MVC核心机制回顾 在ASP.NET MVC中,最核心的当属"路由系统",而路由系统的核心则源于一个强大的System.Web.Routing.dll组件. 在 ...

  5. Asp.Net MVC 3【URLs, Routing,and Areas】续

    http://www.cnblogs.com/HuiTai/archive/2012/07/24/2597875.html 接着前面继续学习分享我们的路由. 现在我们把Global.asax文件里的R ...

  6. Spring MVC 源码分析

    根据上面分析的Spring MVC 工作机制,从三个部分来分析Spring MVC 的源代码. 其一,ApplicationContext 初始化时用Map 保存所有url 和Controller 类 ...

  7. C#WebApi路由机制详解

    随着前后端分离的大热,WebApi在项目中的作用也是越来越重要,可单独部署.与前端和App交互都很方便,既然有良好的发展趋势,我们当然应该顺势而为--搞懂WebApi!Restful相当于给Http请 ...

  8. Node mysql mvc vue_net MVC +Vue.js+Element UI 笔记

    最近项目需求,要在MVC里用Vue 与 Element UI,故而做个笔记来记录一些遇到的问题和处理思路 (方式比较麻瓜,如果不是临时用的话,建议还是学一下Vue-cli,新项目还是老老实实前后端分离 ...

  9. MVC简单实现插件Demo-从底层理解MVC路由匹配浏览器请求的URL

    今天实现了在mvc平台下自定义插件,虽然功能比较简单,但是通过对反射的运用,更加明白了为什么我们在浏览器上输入友好的url时,mvc会智能的帮我们找到我们想要查找的页面呢?mvc在底层又是怎样实现的呢 ...

最新文章

  1. 为什么添加Web引用后,客户端就能远程调用WebService了?
  2. 2022.3.26八仙花
  3. 微信小程序傻瓜制作_盘点:微信小程序制作平台有哪些
  4. Spring 3.1缓存和配置
  5. 程序员要如何学英语?
  6. C++ 工厂模式(设计模式)
  7. 怎么让图片居中php,怎么让CSS文件里图片居中
  8. 技术选型都做不好,难怪自动化做得这么费力...
  9. UITextFiled和UITextView限制字数和输入特殊字符的总结
  10. 细说GIT分布式版本控制器
  11. oracle查询语句大全 oracle 基本命令大全
  12. xshell过期/安装教程
  13. java 分布式日志_打造分布式日志收集系统
  14. 计算机视觉教程0-2:你了解眼里所见的色彩吗?(详解RGB/HSV/Lab)
  15. 高性能的计算机至少有几个cpu,感觉PC对CPU的性能需求快到极限了
  16. win10下配置maven
  17. C#编写一个简单串口通讯上位机
  18. PDF如何修改编辑文字?两种简单的方法分享给大家
  19. 服务器主板四路SLI时候出现的问题
  20. 腾讯前端常考面试题汇总

热门文章

  1. Jmeter学习笔记之响应断言
  2. 数据库理论 —— 数据库设计六大范式
  3. python字典是可迭代对象么_Python 迭代器与可迭代对象,看不懂你找我
  4. jsp 和 html作为前端页面的区别
  5. element-ui 修改时间选择器样式
  6. JavaWeb项目之租车系统管理系统
  7. 在购买天猫店铺转让的时候要注意什么
  8. Spring自动装配实现原理
  9. 解决方案: 您目前无法访问 因为此网站使用了 HSTS
  10. wms仓储管理系统有哪些特点?