通知/代理/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:

Block是iOS4.0+ 和Mac OS X 10.6+ 引进的对C语言的扩展,用来实现匿名函数的特性。
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对比

效率:Delegate比NSNOtification高;?
 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。

时间: 2024-07-31 13:57:22

通知/代理/block 三者比对的相关文章

通知 代理 block对比。

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

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

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

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

UI13-GET POST 同步,异步-代理 Block请求方式。

http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx?date=20131129&startRecord=1&len=5&udid=1234567890&terminalType=Iphone&cid=213 http://project.lanou3g.com/teacher/yihuiyun/lanouproject/activitylist.php 两个接

iOS 通知代理执行代理方式时,代理为nil的解决办法

1.下面代码是描述: 点击Toolbar上的按钮时,通知代理去调代理方法. 1 - (void)didClickedToolbarBtn:(UIButton *)button 2 { 3 4 if ([self.delegate respondsToSelector:@selector(toolbar:didClickedButton:)]) { 5 [self.delegate toolbar:self didClickedButton:button.tag]; 6 } 7 self.sele

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

1.从源头上理解和区别block和delegate delegate运行成本低,block的运行成本高. block出栈需要将使用的数据从栈内存拷贝到堆内存,当然对象的话就是加计数,使用完或者block置nil后才消除.delegate只是保存了一个对象指针,直接回调,没有额外消耗.就像C的函数指针,只多做了一个查表动作. 2.从使用场景区别block和delegate 有多个相关方法.假如每个方法都设置一个 block, 这样会更麻烦.而 delegate 让多个方法分成一组,只需要设置一次,

整理一下 通知传值 Block传值

Block: 一. (1) 在需要传值的界面定义属性 // 点击collectionViewCell的回调 @property (nonatomic, copy) void(^DidcollectionClick)(NSIndexPath *indexPath); 在按钮或者手势 或者代理方法中 执行block - (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPa

代理&amp;Block 传值

刚学习苹果开发的时候不懂代理,Block,感觉好麻烦,就知道大概意思,现在回头看,发现就懂了,留一份自己的Demo希望初学的人能够看出点什么. 代理传值:在第二个界面输入值传给第一个界面 MainViewController #import <UIKit/UIKit.h> @interface MainViewController : UIViewController @property (nonatomic, retain) UITextField *labelTwo; @end #impo

通知&amp;代理

通知:多对多的关系,比较耗性能 使用: 1.观察者到通知中心注册(接受那个发布者发布的什么通知,监听到通知后的处理方法) [[NSNotificationCenter defaultCenter] addObserver:selfselector:@selector(keyBoardShow:) name:UIKeyboardDidShowNotification object:nil]; 2.移除观察者 [[NSNotificationCenter defaultCenter] removeO