美文网首页
iOS 底层学习15 -- _block的内存管理

iOS 底层学习15 -- _block的内存管理

作者: 恋空K | 来源:发表于2020-08-28 18:49 被阅读0次


    由此可知外面访问的age,其实是_block age对应的结构体里面的age。



    一旦block内部要访问对象了,用到某个对象了,block肯定要对它访问的对象进行内存管理。此时block底层结构的Desc会多两个函数,一个copy,一个dispose
    int age的情况
    int age的情况

    下面是age加了_block修饰的情况




    此时多了两个内存管理相关的函数,一个copy,一个dispose。

    block最开始肯定是在栈上的,也就是栈block,但当block copy到堆上面去的时候,它会做另外一件事情,它会自动将我们block内部使用到的_block 变量的内存也拷贝到堆上,而且block内部对_block变量形成的是强引用。
    当另一个block也访问这个_block的时候,当该block也copy到堆上的时候,此时_block不需要在copy到堆上,因为上一次该_block已经copy到堆上了,但该block对_block形成的也是强引用。


    block强引用_block变量
    block释放强引用的_block变量

    block内部要直接使用的对象,既然是block要直接内部使用它,那block就要对它负责,对它内存进行管理,进行负责,所以由block来决定什么时候把它放到堆上面去,什么时候把它从堆中移除。
    _weak只能修饰oc对象。



    保证访问的肯定是复制到堆上的age中的age
    block内部访问到的age就是堆上的!!!
    _weak是用来修饰person对象的,不是用来修饰_block的,因为_block _weak int age = 10这么写是不好使的 当block拷贝到堆上的时候,block内部_block 变量生成的结构体也会拷贝到堆上,此时要是_block修饰的是oc类型的对象,当_block 变量生成的结构体拷贝到堆上的时候,会调用结构体里面的copy函数,
    如果是MRC环境下,不管person,怎么写,结构体对person都是弱引用,这是比较蛋痛的一点,需要记住
    MRC环境下,block还没释放,但是perosn已经挂了,也就是说,MRC环境下,_block修饰person,block里面不会对perosn引用计数加1,也就是不会产生强引用
    MRC环境下,去掉_block修饰perosn,此时block还没有释放的时候,perosn也不会释放,说明block里面强引用了person,也就是block对perosn进行了引用计数加1
    MRC环境下,block释放后,person也释放了
    总结

    相关文章

      网友评论

          本文标题:iOS 底层学习15 -- _block的内存管理

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