block

作者: 有涯逐无涯 | 来源:发表于2016-04-14 20:27 被阅读46次

MRC中分为

* NSConcreteGlobalBlock 全局静态block,不会访问任何外部变量

* NSConcreteStackBlock 保存在栈上的block,函数返回时会被销毁,编译器自动管理(栈内存特点),在MRC模式下初始化之后的非全局静态block都是这种类型,所以需要说明的是,MRC模式下,对于block的引用应该用copy,这样该block就会转变成下面这种类型

* NSConcreteMallocBlock 保存在堆上的block,程序管理生命周期,引用计数为0时才会被销毁。MRC下的栈上block被copy时被copy到堆上,变为MallocBlock。

ARC中去掉了NSConcreteStackBlock,默认block即为NSConcreteMallocBlock。可能苹果觉得ARC的内存管理能力足够强大,释放足够及时,堆上内存如果释放及时,还是有很大优势的,毕竟空间和引用管理比较方便

block对外部变量的使用有一个capture机制,其实质是将其copy进相关struct中供block使用的,内部修改不会影响外部。

如果需要影响外部,则变量申明为_block关键字即可,这样内部对该变量的实用变成了指针引用。

以上说明适用于分配在栈上的变量,对于堆上的指针变量天生就能修改原值,但是需要注意:

* 防止循环引用

* 防止野指针

1. 防止循环引用可以用__weak关键字声明指针

2. 防止野指针可以在block内部对其指针引用技术+1,结束之后-1(MRC),或者可以在block内部使用__strong关键字声明指针指向外部用__weak声明的变量

对于第二点可能有同学说,我平时没这么声明也没问题啊,是的,这需要前提,外部函数所属的对象的生命周期比block要长,否则就会因为引用了野指针crash了

火车上不方便补代码,回头补上代码例子

相关文章

  • 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/lcnglttx.html