Block 笔记

Block表达式语法:^ 返回值类型 (参数列表) {表达式}
声明Block类型变量语法:返回值类型 (^变量名)(参数列表) = Block表达式

block:我们称代码块,他类似一个方法。而每一个方法都是在被调用的时候从硬盘到内存,然后去执行,执行完就消失,所以,方法的内存不需要我们管理,也就是说,方法是在内存的栈区。所以,block不像OC中的类对象(在堆区),他也是在栈区的。如果我们使用block作为一个对象的属性,我们会使用关键字copy修饰他,因为他在栈区,我们没办法控制他的消亡,当我们用copy修饰的时候,系统会把该 block的实现拷贝一份到堆区,这样我们对应的属性,就拥有的该block的所有权。就可以保证block代码块不会提前消亡。

自动变量截获的值为Block声明时刻的瞬间值,保存后就不能改写该值,如需对自动变量进行重新赋值,需要在变量声明前附加__block说明符,这时该变量称为__block变量。

当自动变量为一个类的对象,且没有使用__block修饰时,虽然不可以在Block内对该变量进行重新赋值,但可以修改该对象的属性。
如果该对象是个Mutable的对象,例如NSMutableArray,则还可以在Block内对NSMutableArray进行元素的增删:

__block 全局变量 静态变量(static), block中都可修改其值,并调用block前修改其实新值;
局部变量,block中都不可修改其值,并调用block前修改其实旧值;

__block在MRC下有两个作用

  1. 允许在Block中访问和修改局部变量
  2. 禁止Block对所引用的对象进行隐式retain操作

__block在ARC下只有一个作用

  1. 允许在Block中访问和修改局部变量

block内部调用了延时函数,并且使用了弱指针,此时会找不到该指针,因为他已经被销毁,需要再block内部将弱指针重新引用。

Block 笔记_第1张图片
iOS内存.png

你可能感兴趣的:(Block 笔记)