美文网首页iOS高级进阶
__block的内存管理

__block的内存管理

作者: 南城同學 | 来源:发表于2019-10-15 19:13 被阅读0次
  __block int age = 10; 
  Block block1 = ^{
         age = 20;
   };
  • 当block在栈上时,并不会对__block变量产生强引用;
  • 当block被copy到堆时:
    1.会调用block内部的copy函数;
    2.copy函数内部会调用_Block_object_assign函数;
    3._Block_object_assign函数会对__block变量形成强引用(retain)。
  • 当block从堆中移除时:
    1.会调用block内部的dispose函数;
    2.dispose函数内部会调用_Block_object_dispose函数;
    3._Block_object_dispose函数会自动释放引用的__block变量(release);

copyblock时,__block变量的变化:
  • 在ARC环境下,当block被强引用引用着时,它会自动进行copy操作。
  • block被copy到了堆上,__block int age = 10按理来说它在栈上的,堆上的指针指向栈上的内存地址 ? 不安全。
  • 所以在block被copy到堆上时,它会自动将block内部使用的__block变量的内存,也copy到堆上,而且block内部会对这个__block变量形成强引用。

__block变量为什么有一个指向自己的指针*__forwarding ?
  • age为例:当 __block变量复制到堆上时,栈上有一个age,堆上有一个age,如何确保在block内部给age赋值时,是赋值给了堆上的age ?
  • __block变量复制到堆上,栈上__block变量中的__forwarding指针就会指向堆中的__block变量,堆中的__forwarding还是指向自己。赋值的操作是:(age->__forwarding->age) = 20;
  • 这样无论你拿到的age地址是栈上的还是堆上的,只要通过__forwarding指针访问到的堆中的age

__block修饰对象类型

  • 当__block变量在栈上时,不会对指向的对象产生强引用;
  • 当__block变量被copy到堆时;
  1. 会调用__block变量内部的copy函数;
  2. copy函数内部会调用_Block_object_assign函数;
  3. _Block_object_assign函数会根据所指向对象的修饰符(__strong__weak__unsafe_unretained)做出相应的操作,形成强引用(retain)或者弱引用(注意:这里仅限于ARC时会retain,MRC时不会retain,即:MRC环境下,始终是弱引用)。

相关文章

  • Block内存管理实例分析

    Block内存管理实例分析 Block内存管理实例分析

  • Block内存管理

    对block自身内存的管理 对于block,有两个内存管理方法:Block_copy, Block_release...

  • iOS内存管理详解

    目录 block内存管理 autorelease内存管理 weak对象内存管理 NSString内存管理 new、...

  • Block 使用总结

    Block 内存管理: Block 内存主要分派到 NSGlobalBlock(data area),NSMall...

  • iOS面试之Block大全

    Block Block内容如下: 关于Block 截获变量 __block修饰符 Block的内存管理 Block...

  • iOS面试之Block模块

    Block Block内容如下: 关于Block 截获变量 __block修饰符 Block的内存管理 Block...

  • Block

    一、Block本质 二、 BlocK截获变量 三、__block 修饰变量 四、Block内存管理 五、Block...

  • Block

    Block介绍 截获变量 __block修饰符 Block的内存管理 Block的循环引用 一、Block介绍 1...

  • block的内存管理

    block的内存默认放在栈中,(开发人员不需要管理block内存),block所引用的对象的retainCount...

  • block的一些注意事项

    Block的使用注意: block的内存管理(注意循环引用,默认在栈中(不需要内存管理),通过copy就在在堆中,...

网友评论

    本文标题:__block的内存管理

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