ios block和delegate的区别
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ios block和delegate的区别相关的知识,希望对你有一定的参考价值。
1.共同的作用:Block 和 Delegate中的方法都可以理解成回调函数,当某件事情发生的时候取执行一段代码片段2.Block(代码块)优点:是一种轻量级的回调,能够直接访问上下文,使用块的地方和块的实现地方在同一个地方,使得代码组织更加连贯3.Delegate(代理)相对来说是重量级的回调,缺点: 因方法的声明和实现分离开来,代码的连贯性不是很好 代理很多时候需要存储一些临时数据优点: 代理的回调函数可以是一组多个函数,在不同的时机调用不同的回调函数4.如何选择使用哪一种 1.当回调函数多于3个的时候,采用代理比较好 2.使用代码块容易造成循环引用,代理不会出现该问题 3.其他情况下优先考虑代码块Block分为三种:临时性的,只用在栈当中,不会存储起来。比如数组的 foreach 遍历,这个遍历用到的 block 是临时的,不会存储起来。需要存储起来,但只会调用一次,或者有一个完成时期。比如一个 UIView 的动画,动画完成之后,需要使用 block 通知外面,一旦调用 block 之后,这个 block 就可以删掉。需要存储起来,可能会调用多次。比如按钮的点击事件,假如采用 block 实现,这种 block 就需要长期存储,并且会调用多次。调用之后,block 也不可以删除,可能还有下一次按钮的点击ios block和delegate的区别 参考技术A 我怎么知道什么区别 我就懂 交易猫Delegate/Block/NSNotification与多线程
Delegate/Block/NSNotification是最常用的事件同步方法,各自特点、区别、使用方法就不赘述了。
下面主要想强调一下再多线程中使用Delegate/Block/NSNotification的注意事项。
开发时Delegate的调用方法、Block的调用方法、NSNotification的post方法都可能会在非主线程中调用,此时Delegate/Block/NSNotification的回调方法也将被这个非主线程调用,尤其是Delegate的实现方法很少有人会考虑内部的多线程实现,比如更新UI。由于Delegate/Block/NSNotification可能同时在主线程和非主线程中使用,所以实现时必须同时考虑两种情况。例如更新UI的部分需要写成下面的样子:
dispatch_async(dispatch_get_main_queue(),^{
UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(50, 50, 100, 44)];
[self.view addSubview:button];
[button release];
});
如果很不幸写成了
dispatch_sync(dispatch_get_main_queue(),^{
UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(50, 50, 100, 44)];
[self.view addSubview:button];
[button release];
});
那么在主线程调用的时候就完了。。。没有然后了。。。
如果是大型项目你真心不知道别人会干嘛。。。
如果是小型项目你怎么知道以后不会发展成大项目。。。
所以还是注意点吧!
以上是关于ios block和delegate的区别的主要内容,如果未能解决你的问题,请参考以下文章
iOS开发Delegate,Notification,Block使用心得
iOS边练边学--Segue数据逆传(用block代替delegate)