61 (OC)* 代理 block 通知 代理 kvo

1.从源头上理解和区别block和delegate

delegate运行成本低,block的运行成本高。

block出栈需要将使用的数据从栈内存拷贝到堆内存,当然对象的话就是加计数,使用完或者block置nil后才消除。delegate只是保存了一个对象指针,直接回调,没有额外消耗。就像C的函数指针,只多做了一个查表动作。

2.从使用场景区别block和delegate

有多个相关方法。假如每个方法都设置一个 block, 这样会更麻烦。而 delegate 让多个方法分成一组,只需要设置一次,就可以多次回调。当多于 3 个方法时就应该优先采用 delegate。当1,2个回调时,则使用block。

delegate更安全些,比如: 避免循环引用。使用 block 时稍微不注意就形成循环引用,导致对象释放不了。这种循环引用,一旦出现就比较难检查出来。而 delegate 的方法是分离开的,并不会引用上下文,因此会更安全些。

delegate回调返回的参数被限制在了 NS 类的范围内,数量也很有限(当然可以用直接调用方法的形式在绕过,并不推荐;也可以用 Array 套着传, 不过这样需要有文档支持,不然不够清晰,回调方法也需要独立的验证,故也不推荐)。

效率 肯定是delegate比NSNotification高。

KVO提供一种机制,当指定的被观察的对像的属性被修改后,KVO会自动通知响应的观察者,KVC(键值编码)是KVO的基础

KVO使用:被观察着发生addobserver:forkeyPath:options:context:方法来添加观察者.然后只要被观察者的keypath值发生变化(注意单纯改变值不会调用此方法,只有通过getter和sett来改变值才会触发KVO),就会在观察者里调用方法observerValueForKeyPath:ofobject:change:context:因此实现此方法来对KVO发出的通知做出响应.

被观察者不用添加任何代码,所以谁要监听谁要注册,然后对响应进行处理即可,使得观察者与被观察者完全解耦,运用很灵活很简便,但是KVO只能检测类中属性,并且属性名都是通过NSString来查找,编译器不会帮你检测对错和补全,纯手敲会比较容易出错

通知:是一种广播机制,在实践发生的时候,通过通知中心对象,一个对象能够为所有关心这个时间发生的对象发送消息,两者都是观察者模式,不同在于KVO是被观察者直接发送消息给观察者,是对象间的直接交互,通知则是两者都和通知中心对象交互,对象之间不知道彼此

NSNotification的特点,就是需要被观察者先主动发出通知,然后观察者注册监听后,再来进行响应,比KVO多了发送通知的一步,但是其优点是监听不局限属性的变化,还可以对多种多样的状态变化进行监听,监听范围广,使用灵活.

单例

一个单例类,在整个程序中只有一个实例,并且提供一个类方法供全局调用,在编译时初始化这个类,然后一直保存在内存中,到程序(APP)退出时由系统自动释放这部分内存。

UIApplication(应用程序实例类)

NSNotificationCenter(消息中心类)

NSFileManager(文件管理类)

NSUserDefaults(应用程序设置)

NSURLCache(请求缓存类)

NSHTTPCookieStorage(应用程序cookies池)

原文地址:https://www.cnblogs.com/zyzmlc/p/11411711.html

时间: 2024-11-05 20:29:48

61 (OC)* 代理 block 通知 代理 kvo的相关文章

代理、通知、KVO

代理设计模式的作用: 1.A对象监听B对象的一些行为,A成为B的代理 2.B对象想告诉A对象一些事情,A成为B的代理 代理设计模式的总结: 如果你想监听别人的一些行为,那么你就要成为别人的代理 如果你想告诉别人一些事情,那么就让别人成为你的代理 代理设计模式的开发步骤 1.拟一份协议(协议名字的格式:控件名 + Delegate),在协议里面声明一些代理方法(一般代理方法都是@optional) 2.声明一个代理属性:@property (nonatomic, weak) id<代理协议> d

代理和通知

代理和通知 代理的使用步骤 定义一份代理协议 协议名字的格式一般是:类名 + Delegate 比如UITableViewDelegate 代理方法细节 一般都是@optional 方法名一般都以类名开头 比如- (void)scrollViewDidScroll: 一般都需要将对象本身传出去 比如tableView的方法都会把tableView本身传出去 必须要遵守NSObject协议 比如@protocol XMGWineCellDelegate <NSObject> 声明一个代理属性 代

oc学习之路----代理模式2-使用步骤

之前已经写过一个个人关于代理模式的一些看法,现在就来总结一下使用代理模式的步骤吧. 1.先搞清楚谁是谁的代理(delegate) ● 2.定义代理协议,协议名称的命名规范:控件类名 + Delegate ● 3.定义代理方法 Ø代理方法一般都定义为@optional Ø代理方法名都以控件名开头 Ø代理方法至少有1个参数,将控件本身传递出去 Ø 4.设置代理(delegate)对象  (比如myView.delegate = xxxx;) Ø代理对象遵守协议 Ø代理对象实现协议里面该实现的方法 Ø

iOS开发——OC篇&amp;消息传递机制(KVO/NOtification/Block/代理/Target-Action)

iOS开发中消息传递机制(KVO/NOtification/Block/代理/Target-Action) 今晚看到了一篇好的文章,所以就搬过来了,方便自己以后学习 虽然这一期的主题是关于Foundation Framework的,不过本文中还介绍了一些超出Foundation Framework(KVO和Notification)范围的一些消息传递机制,另外还介绍了delegation,block和target- action. 大多数情况下,消息传递该使用什么机制,是很明确的了,当然了,在某

回传值(代理、通知、block)

回传值问题,一直都是困扰初学者的问题,今写者 代理.通知.block 三者的回传值做了一个小小的总结, Main.storyboard 视图: 通过代码分别创建三个代表 代理.通知.block 的按钮,点击相应的按钮,会将相应的文本传入文本框中显示出来 代码如下: 1 // GWFMyDelegateBlockNotyView.h 2 // 回传值 3 4 #import <UIKit/UIKit.h> 5 @class GWFMyDelegateBlockNotyView; 6 7 //协议

通知/代理/block 三者比对

通知 :   “一对多”,”多对一” 传值 四个步骤:  1.发送通知2.创建监听者3.接收通知4.移除监听者 使用场景:1- 很多控制器都需要知道一个事件,应该用通知:2 - 相隔多层的两个控制器之间跳转 注意事项:  1, 一旦接收消息的对象多了,就难以控制了,可能有你不希望的对象接受了消息并做了处理 2,创建了观察者,在dealloc里面一定要移除: ————————————————————————————————————————————————————————————— 代理 “一对一”

iOS开发——项目实用技术OC篇&amp;将Block作为代理来使用,实现传值

将Block作为代理来使用,实现传值 在这里http://www.cnblogs.com/iCocos/p/4659878.html,笔者已经将代理,Block,通知传值的方式总结了一下,今天使用的不一样,我们这里使用的是在一个方法中将一个block代码保存起来,再回到blcok内部去执行. 这里使用的是在地图中,,,,好了不多说,开干 1:首先,定义一个blcok typedef void(^ResultBlock)(CLLocation *currentLoc, CLPlacemark *p

iOS开发——UI篇&amp;代理/通知/Block传值(实现UItableView分组的收缩与展开)

代理/通知/Block传值实现UItableView分组的收缩与展开 初始化之后出现下面的界面 准备: 1:定义一个BOOL值用来记录点击 1 @property (nonatomic, assign, getter = isOpen) BOOL open; 2:在相应的点击方法里面是实现点击 1 self.group.open = !self.group.open; 3:在numberOfRowsInSection中返回的时候使用三木判断是否点击,并且实现伸缩与展开, 1 return mod

通知 代理 block对比。

通知: 1.“一对多”,“多对一”传值 2.应用场景: 一对多传值的时候.  相隔多层的控制器之间传值的时候. 3.使用通知需要注意的是,控制器销毁的时候一定记得移除通知,项目中的通知尽量越少越好,通知多了比较难控制,很有可能发出了通知有别的控件监听到了从而做出相应操作 4.对于通知来说,通知的发送者根本不管接收者是否收到通知,也不管收到通知之后做什么操作,发送者只管发送,发送之后跟他没有一毛钱的关系了. 代理: 1.“一对一传值” 2.应用场景:一般用过公共接口,比如tableview的dal