block是匿名函数,能够实现函数回调功能
block可以访问block函数以及语法作用区域以内的外部变量
用于页面之间通信,同时可以进行传值
void(^block)(void) = ^(void) { };
其中:
1.void(^block)(void)
是类型
2.block
是变量名
3.^(void){};
是block实现 ,上述方法等号后边的返回值类型和参数列表都可以省略.
block的内存管理:
- 没有使用局部变量的block内存存储在全局区
- block内部使用局部变量的时候内存存储在栈区.
- 当block变量定义为属性的时候,必须使用copy修饰,retain无效,即retain和assign会造成野指针问题.
(当对block进行copy操作的时候,此时block的内存区域为堆区.)
1.当block里面会有b类相关的参数要回调回去的时候,属性用copy修饰,将其拷贝到堆里面,这样即便栈释放掉了,b类的指针也在堆中存在,能够成功的回调回去。
2.如果语法块仅仅是执行而不再回调回去了, 比如操作某个数据库,修改某个单利类的属性,发送某个通知之类的,则可以用weak来修饰。
注意:这里不都用copy,原因是优化内存。 如果这个类要传入1000Block来执行,而这个类又不会马上释放掉的话,用copy是不是就拷贝了1000个在堆里面? 这样就会占用很大一部分内存,如果使用了weak将不必要的执行后就可以马上释放掉是不是就节约了很多的内存了。
** __weak在ARC下修饰,__block在MRC下修饰,防止循环引用.
** __block:第二个作用,修饰局部变量,MRC和ARC通用.***在block内部不能直接修改局部变量的值, 如果想修改必须声明成__block类型的变量 ***