Block是封装了上下文和函数指针的OC对象
Delegate是设计模式。
他俩放一起说 是指回调的那个方向!
1.共同的作用:
Block 和 Delegate中的方法都可理解成回调函数,某事发生的时候执行一段代码。
2.Block(代码块)
优点:是一种轻量级的回调,能够直接访问上下文,使用和实现在同一个地方,使得代码组织更加连贯,容易阅读。
缺点:容易造成循环引用。
3.Delegate(代理)
相对来说是重量级的回调,
缺点:
因方法的声明和实现分离,代码的连贯性不是很好
代理很多时候需要存储一些临时数据
优点:
代理的回调函数可以是一组多个函数,在不同时机调用不同的函数
4.如何选择使用哪一种
4-1.当回调函数多于3个的时候,采用代理比较好
4-2.使用代码块容易造成循环引用,代理不会出现该问题
4-3.其他情况下优先考虑代码块
Block分为三种:
临时性的,只用在栈当中,不会存储起来。
比如数组的foreach 遍历,block是临时的,不会存储起来。
需要存储起来,但只会调用一次,或者有一个完成时期。
比如一个UIView 的动画,动画完成之后需要使用block通知外面,一旦调用block之后这个block就可以删掉。
需要存储起来,可能会调用多次。
比如按钮的点击事件,假如采用block实现这种block就需要长期存储,并且会调用多次。调用之后block也不可以删除,可能还有下一次按钮的点击。
5.循环引用: 就是多个对象之间相互引用,会导致内存泄露.
ARC(Automatic Reference Counting)机制下很容易产生循环引用.
block避免循环引用
__weak OneViewController *weakSelf = self;
threeController.block = ^() {
NSLog(@"Hello, %@!", weakSelf.name);
};
delegate避免循环引用
@property (weak, nonatomic) id<TwoViewControllerDelegate> delegate;
网友评论