iOS面试 -- Block相关重点

作者: 爱玩游戏的iOS菜鸟 | 来源:发表于2019-11-18 12:00 被阅读0次

    Block的本质

    • Block是将函数及其上下文封装起来的对象

    Block调用

    • Block调用就是函数的调用

    截获变量

    • 局部变量
      1.基本数据类型
      2.对象类型

    • 全局变量

    • 静态局部变量

    • 静态全局变量

    关于Block截获变量的特性,是否有理解?
    • 对不同的数据类型,截获方式各有不同
      1.对基本数据类型的局部变量截获其值
      2.对于对象类型的局部变量连同所有权修饰符一起截获
      3.以指针方式截获静态局部变量
      4.不截获全局变量、静态全局变量
    输出结果是什么呢?
    在什么场景下使用__block修饰符呢?
    • 对截获变量进行赋值操作需要添加__block修饰符(赋值 != 使用

    • 对局部变量(基本数据类型和对象类型)进行赋值需要__block修饰符

    • 对静态局部变量、全局变量、静态全局变量不需要__block修饰符


      使用操作,不需要__block修饰
      赋值操作,需要添加__block修饰符
      添加__block修饰后,结果为8
    __block修饰符起到了什么作用?__block的机制是什么?
    • __block修饰变量变成了对象
    __forwarding指向同类型的指针
    Block的内存管理
    • _NSConcreteGlobalBlock
    • _NSConcreteStackBlock
    • _NSConcreteMallocBlock


      不同类型的block
      三种类型的block存储区域
    需要在什么时候对block进行copy操作?
    1. 首先明白三种类型的block进行copy有什么效果
    • 对于数据区的block进行copy操作,什么也不做
    • 对于栈区的block进行copy操作,在堆区产生block
    • 对于堆区的block进行copy操作,会增加引用计数
    1. 生命周期
    • 对于栈区的block,变量作用域结束,随之销毁


      在MRC环境下,对栈区的block进行copy操作,不作处理会产成内存泄漏
    __forwarding总结
    • 不管在任何内存位置,都可以顺利的访问同一个__block变量
    Block循环引用(为什么会产生循环引用)在下图中,有什么问题?如何解决?
    示例
    • 产生自循环引用 因为当前对象通过copy声明block,而在当前block中又使用到了当前对象的成员变量,因为会连带属性关键字一起截获,因为array是通过strong修饰,因此block中有一个strong类型的指针指向当前对象,产生循环引用
    • 解决方法:避免循环引用——在当前栈中用__weak修饰的weakArray指针指向原对象的_array,在block中使用weakArray(因为截获的是一个__weak类型)
    (__block造成的循环引用)在下图中,有什么问题?如何解决?
    示例
    • 在MRC中,不会产生循环引用
    • 在ARC中,产生循环引用,引起内存泄漏


      解决方案,断环 但是如果一直不调用block,环就一直存在

    相关文章

      网友评论

        本文标题:iOS面试 -- Block相关重点

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