美文网首页iOS面试iOS 临点记录阅读记录
iOS开发—block十个面试题总结

iOS开发—block十个面试题总结

作者: 程序员_秃头怪 | 来源:发表于2019-03-01 20:05 被阅读20次

    1、 什么是block?
    block是对象,它封装了一段代码,这段代码可以在任何时候执行。block可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或返回值。与代理协议的功能一样,也可以用于事件通信。

    2、 使用block和使用delegate完成委托模式有什么优点?
    使用block实现委托模式,其优点是回调的block代码块定义在委托对象函数内部,使代码更为紧凑;
    适配对象不再需要实现具体某个protocol,代码更为简洁。

    3、多线程与block
    GCD与Block
    使用 dispatch_async 系列方法,可以以指定的方式执行block
    GCD编程实例
    dispatch_async的完整定义
    void dispatch_async(
    dispatch_queue_t queue,
    dispatch_block_t block);
    功能:在指定的队列里提交一个异步执行的block,不阻塞当前线程

    4、 _block和__weak修饰符的区别?
    __block不管是ARC还是MRC模式下都可以使用,可以修饰对象,还可以修饰基本数据类型。
    __weak只能在ARC模式下使用,也只能修饰对象,不能修饰基本数据类型。
    __block对象可以在block中被重新赋值,__weak不可以。

    5、 Block不允许修改外部变量的值,这里所说的外部变量的值,指的是栈中指针的内存地址。__block 所起到的作用就是只要观察到该变量被 block 所持有,就将“外部变量”在栈中的内存地址放到了堆中。进而在block内部也可以修改外部变量的值。

    6、block引用变量
    局部非对象
    ·block引用局部变量时,该变量会作为常量编码到block块中。
    ·局部变量需要使用__block修饰,才能在block块中修改
    局部对象
    ·在 block 里面引用一个局部的Objective-C 对象的时候,该对象会被 retain。
    ·如果局部变量使用__block修饰,则不会被retain。
    实例对象
    · 在 block 里面引用一个实例变量时,该实例对象会被 retain。

    7、什么时候Block会出现循环引用,如何解决?
    ·在 block(点语法)里面引用一个实例变量时,该实例对象会被 retain。
    .A对象申明调用block,B对象实现block,并且在实现中调用了A对象
    ·如上规则容易导致循环引用。

    8、 block在ARC中和传统的MRC中的行为和用法有没有什么区别,需要注意些什么?
    (1)、在使用block前需要对block指针做判空处理。
    不判空直接使用,一旦指针为空直接产生崩溃。
    (2)、在MRC的编译环境下,block如果作为成员参数要copy一下将栈上的block拷贝到堆上,//MRC下:_sucBlock = [callbackBlock copy]; 不copy block会在栈上被回收。
    (3)、在block调用之后要对block指针做赋空值处理,如果是MRC的编译环境下,要先release掉block对象。
    A对象申明调用block,B对象实现block,并且在实现中调用了A对象,此时需要在A对象调用完block后附空
    (4)、使用方将self或成员变量加入block之前要先将self变为__weak
    (5)、在多线程环境下(block中的weakSelf有可能被析构的情况下),需要先将self转为strong指针,避免在运行到某个关键步骤时self对象被析构。

    9、GCD跟Block使用需要注意什么?
    GCD使用注意点:
    防止死锁
    GCD不能控制最大任务并发量(无法决定具体开多少子线程,只能由系统决定)
    GCD的请求一旦发送,无法直接取消

    Block使用注意点:
    防止循环引用
    在block中用到外部变量都是只读拷贝的
    栈block超过作用域就被自动释放了
    堆block需要手动释放

    10、Block在ARC跟MRC中的行为和用法有什么区别?
    相同点
    block的本质一样, 都是函数指针
    使用__block都可以解决在block中修改外部变量的问题

    不同点
    解决循环引用的方式不同
    MRC中使用__block
    ARC中使用 __weak
    block用什么属性修饰,为什么?

    在MRC中, 定义Block属性时, 应该用copy修饰
    在ARC中, 定义Block属性时, 系统会自动将其copy, 即复制到堆上. 但习惯上还是会用copy修饰
    用copy修饰的原因
    block创建时默认是创建在栈上的, 超过作用域后就会被销毁, 只有使用copy才会生成一个堆block, 在作用域外被访问

    金三银四即将来临,找工作和面试又被提上了日程,为了解决小伙伴们的燃眉之急,小编特地为大家整理了一份BAT面试题,需要的可以加小编的QQ群:923910776 希望对大家有所帮助,后期会不断更新添加新的面试题,可以帮大家查漏补缺。

    相关文章

      网友评论

        本文标题:iOS开发—block十个面试题总结

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