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

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 希望对大家有所帮助,后期会不断更新添加新的面试题,可以帮大家查漏补缺。

猜你喜欢

转载自blog.csdn.net/weixin_44557309/article/details/88407585
今日推荐