将最近总结的最常用的几种设计模式优势与区别自己小结一下,分享给大家。

kvo只能用来对属性作出反应,而不会用来对方法或者动作作出反应,是实现一个对象与另外一个对象保持同步的一种方法,能够提供观察的属性的最新值以及先前值,同时它是一种响应式编程思想,也就是开发中不需要考虑调用顺序,只需要知道考虑结果,类似于蝴蝶效应,产生一个事件,会影响很多东西,最后影响结果,比如开发中用KVO来监听一个dog类的name属性有没有改变,不需要知道是在哪里做了修改,只要是修改了就收监听到结果。而kvo的底层其实是重写了name属性的set方法,而能够用外界修改name的时候调用set方法就是修改了当前对象的一个isa指针来实现的。它有点类似于swift中的存储型属性中的didSet方法的监听。
 
KVC其实就是键值编码,对象在调用setValue的时候,首先会去找属性的set方法—>成员属性——>直接找对象的这个属性—>报错,比如在字典转模型的时候这个方法就经常会用到,而这里有个坑就是当模型中的属性和字典的key不一一对应,系统就会调用setValue:forUndefinedKey:报错。所以一般我们会重写这个方法防止报错。
 
block 是一种数据类型,我在开发中主要使用在3个场景:1,它作为一个代码块保存在对象中,需要的去调用就可以,在传值的时候用的特别多。2.作为方法的参数,它的实现由外部来决定,这样方法用起来就比较灵活了。3.作为方法的返回值,它的目的就是代替方法,在这个block作为返回值里可以进行很多的操作,外部调用这个方法的时候只需要知道传入的参数是什么就可以,不用知道内部是怎么实现的。实际开发中需要注意的是它的循环引用的问题,block 是 C 的,一般在ARC使用strong,MRC使用copy。
 
代理其实一般是控制器定义的一个协议,当控制器或某个对象遵循了这个协议,并实现了代理方法,就可以通过代理方法来完成不同对象的一些操作或数据传递了。代理有严格的语法,能够实现的方法必须有明确的声明。还有就是代理是一对一的,在一个应用中的控制流程是可以追踪的,而由于通知是可以实现多对多,是很难追踪到的,这点在做调试的时候代理检测起来就比通知好多了,在项目中,代理在控制器值的逆传这块是用得比较多,而且也是比较好用的,做一些简单的回调。比如我在底层界面的功能完成了,需要把一些值传到上一层去,这时候用代理就是比较直接高效了。
 
Notification: 是一种观察者模式,通知的实现比代理要简单得多,而且它是多对多的。通知一般在开发中除了需要监听一些系统的响应,如键盘弹出等,就是用在比如开发模块之间联系不怎么紧密而又需要传值,还有就是多线程之间传值的情况,这时候用通知就比代理来得直接简单了。但使用通知的时候一定要记得在释放对象的时候将通知注销掉,避免出现野指针的现象。
 
 
有哪里写得不对或者写漏的,还请大神们指出,后续改进。。。

简单总结一下NotificationCenter、KVC、KVO、Delegate的更多相关文章

  1. 04 KVC|KVO|Delegate|NSNotification区别

    一. iOS 中KVC.KVO.NSNotification.delegate 在实际的编程中运用的非常多,掌握好他们的运行原理和使用场合对于我们程序的开发将会带来事办工倍的效果:   二. KVC ...

  2. IOS开发之KVC KVO KVB

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

  3. KVC/KVO原理详解及编程指南

    一.简介 1.KVC简介 2.KVO简介 二.KVC相关技术 1.Key和Key Path 2.点语法和KVC 3.一对多关系(To-Many)中的集合访问器方法 4.键值验证(Key-Value V ...

  4. 【转】 KVC/KVO原理详解及编程指南

    原文地址:http://blog.csdn.net/wzzvictory/article/details/9674431 前言: 1.本文基本不讲KVC/KVO的用法,只结合网上的资料说说对这种技术的 ...

  5. 转:KVC/KVO原理详解及编程指南

      作者:wangzz 原文地址:http://blog.csdn.net/wzzvictory/article/details/9674431 转载请注明出处 如果觉得文章对你有所帮助,请通过留言或 ...

  6. 阶段性总结⓵触摸事件&手势识别⓶Quartz2D绘图⓷CALayer图层⓸CAAnimation⓹UIDynamic UI动力学⓺KVC&KVO

    知识点复习   1. 触摸事件&手势识别   1> 4个触摸事件,针对视图的 2> 6个手势识别(除了用代码添加,也可以用Storyboard添加)   附加在某一个特定视图上的, ...

  7. kvc/kvo复习

    kvc/kvo复习 1 小问题 '[<XMGPerson 0x7fb8a8f30220> setValue:forUndefinedKey:]: this XMGPerson * pers ...

  8. iOS开发笔试面试- KVC/KVO简单使用

    转自:http://my.oschina.net/caijunrong/blog/510701 一.对于KVC模式(Key Value Coding): 1.其实在实际开发中用得比较多得就是:接收到j ...

  9. KVC/KVO简单实例代码

    Person.h #import<Foundation/Foundation.h> @classAccount; @interfacePerson :NSObject{ @private ...

随机推荐

  1. Oracle安装时忘记解锁scott用户的解决方案

    最近笔者开始学习Oracle,对于笔者同学安装过程出现各种问题而导致重做系统表示默哀. (1)问题1:64位操作系统安装完以后选择java.exe文件后.sqldeveloper闪退,原因是64位操作 ...

  2. web系列教程之php 与mysql 动态网站 。检索 与更新。

    接着上次WEb 系列开发之php 与mysql动态网站入门. 个人觉得,学习技术就像一棵大树,主干很重要,枝叶其次.对于学习技术,我们应该分清主次关系.怎么学?为什么要学?有一个较好的分寸. 有时候觉 ...

  3. 2016-10-31 reload

    经历了创业公司的欠薪后,决定重新开始,从原本着力于如何快速入门与实现变更为巩固基础再出发. 2016-10-31

  4. POJ 2442 Sequence 优先队列

    题目: http://poj.org/problem?id=2442 #include <stdio.h> #include <string.h> #include <q ...

  5. EF4 Code First和EF6 Code First链接mysql的方法

    1.首先需要下载安装.Net的Mysql驱动 下载地址如下:http://dev.mysql.com/downloads/connector/net/ 2.配置Web.Config EF6: 配置链接 ...

  6. C语言里的指针探析——type *name[] 在函数参数里面,是一个二维指针

    type *name[] 在函数参数里面声明和不在函数里面声明其实不一样. type *name[] 如果在函数参数里声明,则name 是一个二维指针,并不是一个指针数组,而如果不在函数参数里声明,则 ...

  7. 转:如何制作一个定制的 PHP 基础 Docker 镜像(一)

    原文来自于:http://open.daocloud.io/ru-he-zhi-zuo-yi-ge-ding-zhi-de-php-ji-chu-docker-jing-xiang/ 目标:准备一个定 ...

  8. Ajax编程相对路径与绝对路径

    http://www.worlduc.com/blog2012.aspx?bid=16946309 ajax同一域名调用采用相对路径 var url = 'QuerySingleDataByField ...

  9. SET NOCOUNT用法

    当 SET NOCOUNT 为 ON 时,不返回计数(表示受 Transact-SQL 语句影响的行数). 当 SET NOCOUNT 为 OFF 时,返回计数. 如果存储过程中包含的一些语句并不返回 ...

  10. (转)未找到与约束ContractName Microsoft.VisualStudio.Text.ITextDocumentFactoryService~~导出!解决方案。

    今天刚到公司,打开VS2012准备些个小程序练练手,结果打开C#控制台程序创建时弹出个出错警告,于是呼赶紧跑到百度娘那里问问. 百度一番之后,找到了两篇文章: vs2012建立c++项目为啥会这样? ...