Block

2019-08-14  本文已影响0人  BigBossZhu

1. block

  1. 什么是block?
    block是将函数及其执行上下文封装起来的对象.(函数,执行上下文:会对变量进行封装,对象)为什么是对象?源码证明内部有isa指针.这个对象封装了函数以及函数的执行上下文.
  2. 什么是block调用?
    源码分析block的调用就是函数的调用.

2.截获变量.
1. 局部变量
1. 基本数据类型,在block定义的时候截获局部变量的值.调用前已经截获了.
2. 对象类型,连同所有权修饰符一起截获.
2. 静态局部变量
以指针形式进行截获.
3. 全局变量
不对其进行截获.直接进行使用
4. 静态全局变量
不对其进行截获.直接进行使用

3.__block修饰符.
思考:在什么场景需要使用__block修饰符.
一般情况下,对截获变量进行赋值操作时需要添加__block修饰符.需要注意使用和赋值的区别.
对局部变量进行赋值操作需要添加__block修饰符.对静态全局变量,全局变量,静态局部变量进行赋值操作,不需要__block修饰符.

__block原理?
__block修饰的变量变成了对象.(会生成isa指针成员,还有__forwarding指针成员指向当前变量自己,注意的是在栈上block进行copy操作后,会在堆上产生一块内容相同的内存这时候两个区域内__forwarding指针指向的都是堆上的当前变量).

4.Block内存管理.
Block有哪几类?
1. _NSConcreteGlobalBlock:全局Block放在已初始化数据区中data
2. _NSConcreteStackBlock:栈Block放在栈上stack
3. _NSConcreteMalloclBlock:堆Block放在堆上heap
BLock的copy操作.
何时进行copy?每个类型的block进行copy操作所产生的结果?
栈Block,copy会储存在堆上.
全局Block,copy什么都不做
堆Block,copy操作会增加引用计数.
栈上Blcok的销毁.在作用域结束后栈上内容会进行销毁.

__forwarding存在的意义?
不论在任何内存位置,都可以顺利的访问同一个__block变量.没有copy操作的是栈上面的,copy后,不论是栈还是堆block都是操作堆block上的变量.

5.Block循环引用?怎么避免?为什么可以避免?
1. 对象类型,连同所有权修饰符一起截获.如果采用strong类型就会产生循环引用.可以通过__weak创建weak对象指向对象来规避.因为对象类型,连同所有权修饰符一起截获.就会截获成weak类型对象.
2. __block修饰可能产生强引用.

上一篇下一篇

猜你喜欢

热点阅读