美文网首页
Block:_ _Block 修饰符的内存管理

Block:_ _Block 修饰符的内存管理

作者: 东方诗空 | 来源:发表于2022-03-27 10:53 被阅读0次

_ _Block 修饰符的内存管理

当block在栈上时,并不会对__block变量产生强引用

  • 当block被copy到堆时会调用block内部的copy函数
  • copy函数内部会调用_Block_object_assign函数
  • _Block_object_assign函数会对__block变量形成强引用(retain)
image.png
image.png

当block从堆中移除时

  • 会调用block内部的dispose函数
  • dispose函数内部会调用_Block_object_dispose函数
  • _Block_object_dispose函数会自动释放引用的__block变量(release)
image.png image.png

__block的__forwarding指针

image.png image.png

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

  • 当block在栈上时,对它们都不会产生强引用

  • 当block拷贝到堆上时,都会通过copy函数来处理它们
    __block变量(假设变量名叫做a)
    _Block_object_assign((void)&dst->a, (void)src->a, 8/BLOCK_FIELD_IS_BYREF/);

  • 对象类型的auto变量(假设变量名叫做p)
    _Block_object_assign((void)&dst->p, (void)src->p, 3/BLOCK_FIELD_IS_OBJECT/);

  • 当block从堆上移除时,都会通过dispose函数来释放它们
    __block变量(假设变量名叫做a)
    _Block_object_dispose((void)src->a, 8/BLOCK_FIELD_IS_BYREF*/);

  • 对象类型的auto变量(假设变量名叫做p)
    _Block_object_dispose((void)src->p, 3/BLOCK_FIELD_IS_OBJECT*/);

被__block修饰的对象类型

  • 当__block变量在栈上时,不会对指向的对象产生强引用

  • 当__block变量被copy到堆时
    会调用__block变量内部的copy函数
    copy函数内部会调用_Block_object_assign函数
    _Block_object_assign函数会根据所指向对象的修饰符(__strong、__weak、__unsafe_unretained)做出相应的操作,形成强引用(retain)或者弱引用(注意:这里仅限于ARC时会retain,MRC时不会retain)

  • 如果__block变量从堆上移除
    会调用__block变量内部的dispose函数
    dispose函数内部会调用_Block_object_dispose函数
    _Block_object_dispose函数会自动释放指向的对象(release)

相关文章

  • iOS面试之Block大全

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

  • iOS面试之Block模块

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

  • Block

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

  • iOS 面试全方位剖析 -- Block篇

    block 介绍 截获变量 __block修饰符 Block的内存管理 Block的循环引用 为什么 weakSe...

  • iOS-Block知识点整理

    block 介绍 截获变量 __block修饰符 Block的内存管理 Block的循环引用 为什么 weakSe...

  • [iOS面试]第5章 Block相关面试问题

    本文主讲Block相关面试问题,包括Block介绍、截获变量、__block修饰符、Block的内存管理、Bloc...

  • Block相关面试问题

    本文主讲Block相关面试问题,包括Block介绍、截获变量、__block修饰符、Block的内存管理、Bloc...

  • OC中的Block(四)

    __block修饰符的内存管理 当block在栈上时,并不会对__block变量产生强引用 当__block修饰指...

  • Block:_ _Block 修饰符的内存管理

    _ _Block 修饰符的内存管理 当block在栈上时,并不会对__block变量产生强引用 当block被co...

  • iOS Block

    什么是Block 截获变量 __block修饰符 内存管理 循环引用 什么是Block? 将函数及其执行上下文封装...

网友评论

      本文标题:Block:_ _Block 修饰符的内存管理

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