美文网首页
通知,代理,block 区别

通知,代理,block 区别

作者: lgvae | 来源:发表于2016-07-13 17:43 被阅读0次

通知

:   “一对多”,”多对一” 传值

四个步骤:

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。

相关文章

  • 通知,代理,block 区别

    通知 : “一对多”,”多对一” 传值 四个步骤: 1.发送通知 2.创建监听者 3.接收通知 4.移除监听者 使...

  • OC 底层(KVC、KVO、Delegate、Category、

    目录 1.KVC2.KVO3.通知4.代理、委托、协议5.Block、KVO、通知、代理之间的区别6.分类 Cat...

  • OC中的通知

    前言 :这几天参加面试,基础方面问的比较多的就是代理、通知、block、这些。有个面试官还问到了代理和通知的区别,...

  • iOS 通知、代理、block的区别

    通知: 一对多,比如在开发中,很多控制器都想知道一个事件,所以用通知通知的使用,这篇文章比较好http://www...

  • 代理,通知,和block的区别

    1.NotificationCenter 通知中心:“一对多”,在APP中,很多控制器都需要知道一个事件,应该用通...

  • iOS 逆向传值

    代理(delegate)、通知(NSNotification),block等等。 1、委托代理delegate只能...

  • 代理/通知/block

    一:通知(NSNotification) 1.通知的发布 2.通知的监听 3.通知的移除 通知的监听需要在发布之前...

  • 代理,通知,Block

    1.三者的传值对应关系。 我们说通知是”一对多”的关系。 而代理和Block通常是”一对一”的关系。 Block的...

  • 通知,Block,代理

    OC中经常要用到一些事件和参数的传递,通常有三种做法:通知 代理 Block 通知可以一对多,代理 通知 Blo...

  • 通知、代理、block

    通知、代理、block 是iOS中的三大回调方式。 通知 NSNotificationCenter,它就像一个广播...

网友评论

      本文标题:通知,代理,block 区别

      本文链接:https://www.haomeiwen.com/subject/ylurjttx.html