1. 特点: block 是C语言的,是一种数据类型,可以当做参数来传递(这种用的较多), 也可以当做返回值来用(用的较少),是提前转备好的代码,在需要的时候执行。
2.定义,block在定义的时候,要使用copy进行一次拷贝。@property (nonatomic, copy) void (^MyBlock)(NSString *, NSError *);
返回类型 (^blockName)(参数列表) = ^返回类型 (参数列表) { /// 代码实现; }
3.默认情况下,不允许在block内部修改内部变量的指,在外部变量声明时,使用__block 修饰符,则可以在block内部修改变量
4.数组的遍历和排序可以使用block, 遍历: enumerateObjectsUsingBlock: 效率要for 高,苹果官方推荐使用。排序 sortedArrayUsingComparator:
5.block和代理的对比:
1. block是提前准备好块代码,在需要的时候调用执行,简单,所有的代码在一起,便于阅读和维护, 适合用在回调方法较少的情况, 可以用于线程间的通信。在block中使用self 的时候,需要注意循环引用造成内存泄露的问题。解决的方法是, __Weak typeof(self)Myself = self, 使用myself来代替self
2.代理是调用方和被调用方,通过代理协议,来实现代理方法。调用方,1.定义协议,代理方法 2. 定义代理属性,负责执行代理方法的对象,需要使用弱指针,负责会出现循环引用 3.需要的时候,通知代理执行代理方法,需要先判断方法是否实现
被调用方:1.遵守代理协议 2.设置代理,通知谁去执行代理方法 3.实现代理方法,等待被调用
代理试用于协议方法很多的场景,如UITableView