美文网首页
底层原理(四)------Block

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

作者: SwordDevil | 来源:发表于2021-05-25 09:10 被阅读0次

    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在内存中的分布

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


    • 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的

    相关文章

      网友评论

          本文标题:底层原理(四)------Block

          本文链接:https://www.haomeiwen.com/subject/yrmxsltx.html