1.block是什么
block 就是将函数执行上下文封装起来的对象
2.block 有哪些类型
全局block:不访问任何外部变量
堆block:引用计数为0时销毁
栈block:随时可能被销毁
arc下没有栈block了。因为block会自动copy变成堆block
3.block作为属性,用什么关键字修饰?
mrc下:使用copy修饰。因为block申明在栈区,使用copy修饰可以将block从栈区copy到堆区。
arc下:使用copy与strong修饰都可以。因为就算用strong,程序会自动copy,将block从栈区copy到堆区。
4.什么情况下栈上的block会copy到堆上。
(1)手动调用copy方法
(2)对block进行赋值
(3)Block作为函数返回值
(4)调用含有usingBlcock 的方法
5.block对变量的捕获
全局变量: 不捕获
局部变量: 捕获值
静态全局变量: 不捕获
静态局部变量: 捕获指针
6.怎么修改block内的变量
使用__block 修饰变量
使用static 修饰变量
使用全局变量
7.__block 是怎么实现值修改的
变量使用__block修饰后,会被转化成一个结构体,结构体包含五个成员变量:isa指针,指向自身类型的__forwarding指针,flag,size,变量名。通过_forwarding,无论是在block中还是在block外访问block变量,也不管该变量在栈上还是要堆上,都能顺利访问同一个__block变量。
8.Block修改NSMutableArray 需不需要添加__block?
不需要,因为只是对数组内容进行操作,并不是修改他的内存地址。