iOS进阶面试题----Block部分

 

iOS进阶面试题----Block部分

 

1 什么是block

对于闭包(block),闭包就是能够读取其它函数内部变量的函数。 
比如接到电话,百度查询后,返回网页内容给A,这就是一个Block,在M交待工作时,已经定义好,并且取得了F1的任务号(局部变量),却是在当A遇到问题时,才调用执行,跨函数在项目经理M查询百度,获得结果后回调该block。
 
2 block 实现原理
Objective-C是对C语言的扩展,block的实现是基于指针和函数指针。
从计算语言的发展,最早的goto,高级语言的指针,到面向对象语言的block,从机器的思维,一步步接近人的思维,以方便开发人员更为高效、直接的描述出现实的逻辑(需求)。
下面是两篇很好的介绍block实现的博文
 
3 block的使用
使用实例
 
使用typed声明block
typedef void(^didFinishBlock) (NSObject *ob);
这就声明了一个didFinishBlock类型的block,
然后便可用
@property (nonatomic,copy) didFinishBlock  finishBlock;
声明一个blokc对象,注意对象属性设置为copy,接到block 参数时,便会自动复制一份。
 
__block是一种特殊类型,
使用该关键字声明的局部变量,可以被block所改变,并且其在原函数中的值会被改变。
 
 
4 常见系列面试题
面试时,面试官会先问一些,是否了解block,是否使用过block,这些问题相当于开场白,往往是下面一系列问题的开始,所以一定要如实根据自己的情况回答。
1 使用block和使用delegate完成委托模式有什么优点?
首先要了解什么是委托模式,委托模式在iOS中大量应用,其在设计模式中是适配器模式中的对象适配器,Objective-C中使用id类型指向一切对象,使委托模式更为简洁。了解委托模式的细节:
使用block实现委托模式,其优点是回调的block代码块定义在委托对象函数内部,使代码更为紧凑
适配对象不再需要实现具体某个protocol,代码更为简洁
 
 
2 多线程与block
GCD与Block
使用 dispatch_async 系列方法,可以以指定的方式执行block
 
dispatch_async的完整定义
   void dispatch_async(
   dispatch_queue_t queue,
   dispatch_block_t block);
功能:在指定的队列里提交一个异步执行的block,不阻塞当前线程
 
通过queue来控制block执行的线程。主线程执行前文定义的 finishBlock对象
dispatch_async(dispatch_get_main_queue(),^(void){finishBlock();}); 

 

原文地址:https://www.cnblogs.com/iOS-mt/p/4111048.html