-
- Block是一种数据类型, C 语言的,匿名函数,可以被当做参数和返回值传递,
- block是预先定义好的代码,可以在任何需要的时候被执行
- .默认情况下,不允许在块代码内部修改外部变量的数值。
- 用Block传值时要防止循环引用,例如:在一个 控制器中,self强指针指向一个对象,这个 对象又强指针指向一个block,在这个block的代码块中有一个self.,那么就会造成循环引用,从而导致内存无法释放,造成内存泄露。解决方法:只要打断其中一条 强引用,一般 在ARC情况下,通常用__weak修饰block中的self.,来打断强引用。例如:__weak typeof(self)weakSelf = self ,用weakSelf来指向self 的内存地址, 使得self 在block中使用时变成一个弱指针,打断循环引用。在MRC情况下,用__unsafe__unretained来打断强引用,但是__unsafe__unretained是“assign”形式,如果指向的对象被释放,其指针地址还是存在的保存不变,如果继续使用该指针,就会出现“野指针”现象。
- 当Block内引用局部变量时在MRC下使用__block,ARC环境下要用__weak修饰此变量来解除循环引用。
- block 的应用场景是什么?一般用于网络异步加载数据,通过block的参数进行回调数据
- 定义block用copy修饰。
- block的内存管理问题:当block 是一个变量时
- 在ARC运行环境
1> 全局block没有使用外部变量,block内部没有任何可变的因素的情况下,block保存在静态区。
2> C语言malloc / free,保存在堆区(意思是:使用了外部变量,会保存在堆区) - MRC运行环境
1.定义block:保存在栈区
2.需要使用Block_copy,会把block复制到堆区
3. block使用完成之后,需要使用Block_release释放block
4.如果没有使用外部变量(极少极少……),同样保存在全局区
栈区:主要存放局部变量,定义的参数等,在函数结束时,系统会自动回收它的内存空间,特点:方便快捷
堆区:是由程序员自行管理的内存地址,程序结束时,如果内存地址没有释放完全,则由系统回收。特点:灵活