Block

作者: 迷失的信徒 | 来源:发表于2021-05-17 22:55 被阅读0次

定义:闭包(能够读取其他函数内部变量的函数)。闭包 = 一个函数【或者指向函数的指针】 + 该函数执行的外部的上下文变量【也就是自由变量】,其本质是一个特殊的OC对象。

block有三种类型
  • 全局块(_NSConcreteGlobalBlock) ,全局块存在于全局内存中, 相当于单例。
  • 栈块(_NSConcreteStackBlock),栈块存在于栈内存中, 超出其作用域则马上被销毁。
  • 堆块(_NSConcreteMallocBlock),堆块存在于堆内存中, 是一个带引用计数的对象, 需要自行管理其内存。
block循环引用

解决办法

  • ARC:使用_weak
__weak typeof(self) weakSelf = self;
  • MRC:使用_block
__block typeof(self) weakSelf = self;
总结
  • 在block使用的是将外部变量拷贝到堆中的(基本数据类型直接拷贝到堆上,对象类型将栈上的指针拷贝到堆中,并且指针所指向的地址是不变的)。
  • _block修饰符的作用:将block内部用到的变量拷贝到堆中,并且外部变量的地址也改变到了堆中。
  • _weak可以解决循环引用,block在捕获weakObj时,会对weakObj所指向的对象进行弱引用;但是其会导致外部对象在释放了之后,block内部也访问不到这个对象的问题,我们可以在block的内部声明一个_strong变量来指向weakObj,从而使得外部对象既能在block内部保持住,又能避免循环引用的问题。
  • block的实现原理是C语言的函数指针,函数指针即函数内存中的地址,通过这个地址达到可以调用函数的目的。

简单的记录一下

相关文章

  • iOS开发之Block原理探究

    Block概述 Block本质 Block调用 Block分类 Block循环引用 Block原理探究 Block...

  • block的使用

    定义block 返回类型 (^block名称)(参数) = ^(){block内容}; 调用block block...

  • Block 02 - __block

    Block 02 - __block __block 的作用 __block 可以解决 Block 内部无法修改 ...

  • iOS面试之Block大全

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

  • iOS面试之Block模块

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

  • iOS Block

    Block的分类 Block有三种类型:全局Block,堆区Block,栈区Block 全局Block 当Bloc...

  • iOS block 为什么官方文档建议用 copy 修饰

    一、block 的三种类型block 三种类型:全局 block,堆 block、栈 block。全局 block...

  • iOS开发block是用copy修饰还是strong

    Block分为全局Block、堆Block和栈Block1、在定义block没有引用外部变量的时候,block为全...

  • block 初探

    全局block, 栈block, 堆block

  • Block

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

网友评论

      本文标题:Block

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