小知识,大挑战!本文正在参与“程序员必备小知识”创作活动
通过问题看本质!!!
如果被问到Block,你会怎么回答呢?
网络很多文章讲的都很详细,但是我们不可能面面俱全的说出来。不说背下来,就是让你照着说,你也要说不长的时间了。所以我们要有自己的总结,而且讲得要有思路有条理。因此我们可以从以下几点去说。
1、先要知道Block的本质,才能更好的使用。
2、Block种类。
3、Block的copy问题。
Block的本质
Block的本质是一个对象,内部也有isa指针。也是匿名函数,封装了相应的代码块。
Block编译后是一个结构体,内部存储isa指针,所以block也是一个对象。
Block内部声明了一个函数,存储Block代码块内容。
并把函数指针赋值给Block的属性,这也是为什么Block需要调用的原因。
如果不调用,Block内部的代码块将无法执行。(调用Block的函数指针,执行Block代码)
Block种类
全局block
保存在数据段区(.data区),定义在全局区,或者没有访问自动局部变量。
代码块需要的全部信息都能在编译期确定。它是存储在全局内存中,不可能被系统回收,相当于一个单例。
栈Block
保存在栈区,访问了自动局部变量(在局部变量没有被copy之前),是栈Block,处理之后是堆Block
通过__weak修饰的Block,也是栈Block。
堆Block
访问局部变量,并对其进行copy操作。对栈区的block调用copy方法。
栈block有什么问题
在RAC环境下,Block会自动copy到堆区,所以不会有问题
在MRC环境下,需要手动调用copy方法,将其从栈区copy到堆区,如果Block不使用了,还需要调用release方法。
Block都调用copy方法
堆Block copy后
引用计数加1。
全局Block copy后
空操作,因为它是存储在全局区中,它的生命周期是在程序结束后,由系统释放。
栈Block copy后
变成堆Block。