OC-简单粗暴理解Block的本质
2018-08-24 本文已影响221人
li_礼光
block简单粗暴的理解
-
OC的block底层就是个OC对象,包含isa指针,封装了函数的调用.
-
OC的block的底层会捕获局部变量(auto(值传递) / static(指针传递)),简单粗暴来说就是在底层中生成一个捕获的变量. 全局的不会捕获.
PS : 捕获的意思是,在runtime运行时创建一个新的指针.指向block中的调用的成员变量
OC的block最终继承的类型是 : NSBlock类型,有三种类型(数据段,栈,堆)
Block的类 副本源的配置存储域 复制效果 环境
__NSConcreteStackBlock 栈 从栈复制到堆 访问了auto变量
__NSConcreteGlobalBlock 程序的数据区域 什么都不做 没有访问auto变量
__NSConcreteMallocBlock 堆 引用计数增加 __NSConcreteStackBlock调用了copy
-
OC的block用copy修饰,为了将block存放到堆上,引用计数+1,不会自动销毁,方便管理.
-
OC的block在MRC的时候需要考虑以上的三种类型,和调用的配置存储域,但是在ARC的环境下,编译器会自动帮我们Copy和release.
MRC的建议写法 : copy
ARC的建议写法 : strong修饰和copy修饰都可以,偏向于copy,统一MRC的写法
- 用weak修饰的变量,拿到block中去访问,引用计数不会增加,所以不会进行copy操作,不存在强引用.
OC的block的 __block本质细节,在底层转生成一个__block_byref_xxx的指向结构体的指针.
这个新生成的结构体会保存block中的值,当调用这个block的时候,又会从这个新生成的结构体中取值
新的考虑点1 : 这里会是在runtime运行时的时候创建新的结构体对象,会对性能有一定的消耗.
新的考虑点2 : 针对考虑点1,在block中注意使用的是成员变量还是使用对象指针调用.从而考虑到要不要用block去修饰.如果是使用成员变量去修改它的值,那么就需要用__block去修饰.如果用的是对象指针,调用方法的方式,那么就不需要使用__block修饰