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



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

4、block的变量捕获(capture)

注:局部变量为啥需要捕获到block内部,因为他需要跨函数进行操作,全局变量不需要,可以任意操作
self是参数,也就是局部变量 可以捕获到block内部。默认传递2个参数(MJPerson *self, SEL _cmd)
OC里面的方法前面2个参数都是方法调用者跟方法名
2、Block的类型
1、block有3种类型,可以通过调用class方法或isa指针查看具体类型,最终类型都是继承自 NSBlock类型


堆:动态分配内存,需要程序员申请内存,也需要程序员管理内存
栈:放一些局部变量,系统会自动分配内存,也会自动销毁内存
![]()
-
GlobalBlock:
GlobalBlock
-
StackBlock:
StackBlock
为啥打印不是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的

网友评论