通知/代理/block 三者比对
: “一对多”,”多对一” 传值
四个步骤:
1.发送通知
2.创建监听者
3.接收通知
4.移除监听者
使用场景:
1- 很多控制器都需要知道一个事件,应该用通知;
2 - 相隔多层的两个控制器之间跳转
注意事项:
1, 一旦接收消息的对象多了,就难以控制了,可能有你不希望的对象接受了消息并做了处理
2,创建了观察者,在dealloc里面一定要移除;
—————————————————————————————————————————————————————————————
代理
“一对一”,对同一个协议,一个对象只能设置一个代理delegate
六个步骤:
1.声明一个协议,定义代理方法
2. 遵循协议
3.设置一个代理对象
4.调用代理方法
5.给代理赋值
6.实现代理方法
注意事项:
1,单例对象不能用代理;
2,代理执行协议方法时要使用 respondsToSelector检查其代理是否符合协议(检查对象能否响应指定的消息),以避免代理在回调时因为没有实现方法而造成程序崩溃
使用场景:
公共接口,方法较多也选择用delegate进行解耦
iOS最常用tableViewDelegate,textViewDelegate
iOS有很多例子比如常用的网络库AFNetwork,ASIHTTP库,UIAlertView类。
—————————————————————————————————————————————————————————————
block
什么是Block:
Blocks语法块代码以闭包得形式将各种内容进行传递,可以是代码,可以是数组无所不能。
闭包就是能够读取其它函数内部变量的函数。就是在一段请求连续代码中可以看到调用参数(如发送请求)和响应结果。所以采用Block技术能够抽象出很多共用函数,提高了代码的可读性,可维护性,封装性。
使用场景:
一:动画
二:数据请求回调
三:枚举回调
四:多线程gcd
...
异步和简单的回调用block更好
BLOCK最典型的是大所周知的AFNETWORK第三方库。
注意事项:
block需要注意防止循环引用:
ARC下这样防止:
__weak typeof(self) weakSelf = self;
[yourBlock:^(NSArray *repeatedArray, NSArray *incompleteArray) {
[weakSelf doSomething];
}];
非ARC
__block typeof(self) weakSelf = self;
[yourBlock:^(NSArray *repeatedArray, NSArray *incompleteArray) {
[weakSelf doSomething];
}];
———————————————————————————————————————————————————————————
delegate 和 block对比
1, Delegate和Block一般都是一对一的通信;
2, Delegate需要定义协议方法,代理对象实现协议方法,并且需要建立代理关系才可以实现通信;
Block:Block更加简洁,不需要定义繁琐的协议方法,但通信事件比较多的话,建议使用Delegate;
3, delegate运行成本低。block成本很高的。
block出栈需要将使用的数据从栈内存拷贝到堆内存,当然对象的话就是加计数,使用完或者block置nil后才消除;delegate只是保存了一个对象指针,直接回调,没有额外消耗。相对C的函数指针,只多做了一个查表动作 .
4,代理更注重过程信息的传输:比如发起一个网络请求,可能想要知道此时请求是否已经开始、是否收到了数据、数据是否已经接受完成、数据接收失败
block注重结果的传输:比如对于一个事件,只想知道成功或者失败,并不需要知道进行了多少或者额外的一些信息
5 Blocks 更清晰。比如 一个 viewController 中有多个弹窗事件,Delegate 就得对每个事件进行判断识别来源。而 Blocks 就可以在创建事件的时候区分开来了。这也是为什么现在苹果 API 中越来越多地使用 Blocks 而不是 Delegate。
通知/代理/block 三者比对的更多相关文章
- 回传值(代理、通知、block)
回传值问题,一直都是困扰初学者的问题,今写者 代理.通知.block 三者的回传值做了一个小小的总结, Main.storyboard 视图: 通过代码分别创建三个代表 代理.通知.block 的按钮 ...
- css学习--inline-block详解及dispaly:inline inline-block block 三者区别精要概括
*知识储备: 内联元素:是不可以控制宽和高.margin等:并且在同一行显示,不换行. 块级元素:是可以控制宽和高.margin等,并且会换行. 1.inline-block 详解 (1)一句话就是在 ...
- 61 (OC)* 代理 block 通知 代理 kvo
1.从源头上理解和区别block和delegate delegate运行成本低,block的运行成本高. block出栈需要将使用的数据从栈内存拷贝到堆内存,当然对象的话就是加计数,使用完或者bloc ...
- 通知、block
=================================== 通知 =================================== 一.通知(NSNotification) // N ...
- 整理一下 通知传值 Block传值
Block: 一. (1) 在需要传值的界面定义属性 // 点击collectionViewCell的回调 @property (nonatomic, copy) void(^Didcollectio ...
- 四种传值方法(通知、block、属性、NSUserDefaults)
1. 通知传值-一般常用于返回界面的时候,把返回前界面的值传到返回后界面. //前一个界面 //注册通知 [[NSNotificationCenter defaultCenter] addObserv ...
- 通知&代理
通知:多对多的关系,比较耗性能 使用: 1.观察者到通知中心注册(接受那个发布者发布的什么通知,监听到通知后的处理方法) [[NSNotificationCenter defaultCenter] ...
- MCDownloadManager ios文件下载管理器
我们用AFNetworking小试牛刀,写一个简单的下载器来演示功能. 前言 为什么AFNetworking能够成为顶级框架?我们究竟该如何领悟它的精髓所在?这都是很难的问题.安全,高效,流畅,这3个 ...
- 3.多线程NSOperation
1.NSOperation的基本操作 使用NSOperation的两个子类,NSInvocationOperation 和 NSBlockOperation 创建操作,然后将操作添加到队列中去执行 / ...
随机推荐
- [LeetCode]题解(python):142-Linked List Cycle II
题目来源: https://leetcode.com/problems/linked-list-cycle-ii/ 题意分析: 给定一个链表,如果链表有环,返回环的起始位置,否则返回NULL.要求常量 ...
- Excel如何进行SVN
KSFramework常见问题:Excel如何进行SVN协作.差异比较? Excel如何进行SVN协作.差异比较? 嗯,这是一个令人困惑的问题.游戏开发.程序开发时,使用Excel可以添加文档.注 ...
- openstack中iptables的使用
openstack中nova使用了iptables实现其网络相关功能,乍看openstack的iptables表比较复杂,整理了一下iptables的filter表和nat表的结构,以一个all in ...
- HDU 5818 Joint Stacks(左偏树)
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5818 [题目大意] 给出两个栈A B(初始时为空),有三种操作: push.pop.merge. ...
- ruiy_ocfs2
http://docs.oracle.com/cd/E37670_01/E37355/html/ol_instcfg_ocfs2.html
- Hive Server 2 安装部署测试
Hive 0.11 包含了Hive Server 1 和 Hive Server 2,还包含1的原因是为了做到向下兼容性.从长远来看都会以Hive Server 2作为首选 1. 配置hive ser ...
- eclipse svn插件显示作者
在另一台电脑里安装了SVN插件后,发现项目文件后面只有版本号,没有作者名字了,找了很久才找到了,现记录在这里. window->preferences->team->svn-> ...
- iOS中Block介绍(一)基础
ios开发block的使用指南,以及深入理解block的内存管理,也适用于osx开发.讨论范围:block的使用,内存管理,内部实现.不包含的内容:gc arc下的block内存,block在c++中 ...
- vs2010 项目编译 ResGen.exe”已退出,代码为 -1073741701
解决的办法如下: 1.关闭所有Visual Studio: 2.以管理员的身份打开命令提示窗口:(开始-运行-cmd) 3.更改目录至"CD C:\Program Files (x86)\M ...
- ASP.NET性能监视参数详解
性能监视器- Performance Monitor 性能监视器是Windows自带的系统资源和性能监视工具. 性能监视器能够量化地提供CPU使用率, 内存分配状况, 异常派发情况, 线程调度频率等信 ...