美文网首页iOS内存泄露
iOS Block 的简单介绍

iOS Block 的简单介绍

作者: 青葱烈马 | 来源:发表于2016-04-27 21:48 被阅读61次

    Block 的定义:

    @property (nonatomic,copy)void(^myBlock)(int age);

    Block 定义中copy关键字的使用:

    1>使用 copy 关键字是把 block 拷贝到堆中,而栈中的 block 的生命周期是和栈绑定的. 使用 copy 是有可能在 block 代码块里面是用到一些本地变量.

    2>如果使用 copy属性,当其所在栈被释放的时候,这些本地变量将变得不可访问,一旦代码执行到block这段就会导致bad access;

    3>在一个 block 中使用本地变量,如果声名用assign,代码执行到block内部就会出错.

    4>在 Objective-C 语言中,一共有 3 种类型的 block:

             _NSConcreteGlobalBlock 全局的静态 block,不会访问任何外部变量。

             _NSConcreteStackBlock 保存在栈中的 block,当函数返回时会被销毁。   

             _NSConcreteMallocBlock 保存在堆中的 block,当引用计数为 0 时会被销毁。

    5>在 block 中对于外部变量的应用:

             默认情况下,block 是将外部变量 copy 到其数据结构中来实现访问的,

             使用__block 修饰外部变量引用,block 是复制其引用地址来实现访问的.

    block循环引用问题:

    形成原因:

    block引起的内存泄露问题,一般是由于在 block 中使用 self , self 持有当前对象, 当前对象持有 block, block 持有 self.  造成循环引用, 

    解决办法:

    把 block 引用的 self 修饰为弱引用.

    __weak viewController* blockSelf = self;

    相关文章

      网友评论

        本文标题:iOS Block 的简单介绍

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