底层原理(四)------Block

2021-05-25  本文已影响0人  SwordDevil

1、block的本质

1、block本质上也是一个OC对象,它内部也有个isa指针。
2、block是封装了函数调用以及函数调用环境的OC对象


image.png
image.png
image.png

3、auto变量的捕捉(auto 自动变量,离开作用域就销毁)


image.png
4、block的变量捕获(capture)
image.png

注:局部变量为啥需要捕获到block内部,因为他需要跨函数进行操作,全局变量不需要,可以任意操作
self是参数,也就是局部变量 可以捕获到block内部。默认传递2个参数(MJPerson *self, SEL _cmd)
OC里面的方法前面2个参数都是方法调用者跟方法名

2、Block的类型

1、block有3种类型,可以通过调用class方法或isa指针查看具体类型,最终类型都是继承自 NSBlock类型


image.png
3种block在内存中的分布

堆:动态分配内存,需要程序员申请内存,也需要程序员管理内存
栈:放一些局部变量,系统会自动分配内存,也会自动销毁内存


为啥打印不是StackBlock 而是MallocBlock,是因为是ARC环境下
在ARC环境下,编译器会根据情况自动将栈上的block复制到堆上
1.block作为函数返回值(Masonry框架运用大量这种)
2.将block赋值给__strong指针时
3.block作为Cocoa API中方法名含有usingBlock的方法参数时
4.block作为GCD API的方法参数时

三、对象类型的auto变量

四、__block修饰符

五、__block的内存管理


六、对象类型的auto变量、__block变量

七、__block的__forwarding指针

八、被__block修饰的对象类型

九、循环引用


十、解决循环引用---ARC环境下

// __weak:不会产生强引用,指向的对象销毁时,会自动让指针置为nil
// __unsafe_unretained:不会产生强引用,不安全,指向对象销毁时,指针存储的地址值不变

十一、解决循环引用---MRC环境下

MRC下不支持__weak的

上一篇下一篇

猜你喜欢

热点阅读