iOS-Block

185 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动

通过问题看本质!!!

如果被问到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。