美文网首页iOS面试思考
iOS之Block解刨分析

iOS之Block解刨分析

作者: 白水灬煮一切 | 来源:发表于2019-06-20 13:20 被阅读9次

    1 什么是block  block本质上就是一个oc对象(结构体)。

    block是OC对象(C中结构体)

    Block是什么?苹果推荐的类型,效率高,在运行中保存代码。用来封装和保存代码,有点像函数,Block可以在任何时候执行。

    Block和函数的相似性:(1)可以保存代码(2)有返回值(3)有形参(4)调用方式一样。

    2 block 实现原理

    Objective-C是对C语言的扩展,block的实现是基于指针和函数指针。

    从计算语言的发展,最早的goto,高级语言的指针,到面向对象语言的block,从机器的思维,一步步接近人的思维,以方便开发人员更为高效、直接的描述出现实的逻辑(需求)。

    下面是两篇很好的介绍block实现的博文

    3 block的使用

    使用实例

    cocoaTouch框架下动画效果的Block的调用

    使用typed声明block

    typedef void(^didFinishBlock) (NSObject *ob);

    这就声明了一个didFinishBlock类型的block,

    然后便可用

    @property (nonatomic,copy) didFinishBlock  finishBlock;

    声明一个blokc对象,注意对象属性设置为copy,接到block 参数时,便会自动复制一份。

    3、__block是一种特殊类型,

    为了保证block内部能够正常访问外部的变量,block有一个变量捕获机制。

    使用该关键字声明的局部变量,可以被block所改变,并且其在原函数中的值会被改变。

    局部变量

    静态变量会被block捕获指针

    从上述源码中可以看出,a,b两个变量都有捕获到block内部。但是a传入的是值,而b传入的则是地址。

    为什么两种变量会有这种差异呢,因为自动变量可能会销毁,block在执行的时候有可能自动变量已经被销毁了,那么此时如果再去访问被销毁的地址肯定会发生坏内存访问,因此对于自动变量一定是值传递而不可能是指针传递了。而静态变量不会被销毁,所以完全可以传递地址。而因为传递的是值得地址,所以在block调用之前修改地址中保存的值,block中的地址是不会变得。所以值会随之改变。

    全局变量

    全局变量block不会捕获 block捕获机制总结

    4 常见系列面试题

    面试时,面试官会先问一些,是否了解block,是否使用过block,这些问题相当于开场白,往往是下面一系列问题的开始,所以一定要如实根据自己的情况回答。

    1 使用block和使用delegate完成委托模式有什么优点?

    首先要了解什么是委托模式,委托模式在iOS中大量应用,其在设计模式中是适配器模式中的对象适配器,Objective-C中使用id类型指向一切对象,使委托模式更为简洁。了解委托模式的细节:

     iOS设计模式----委托模式 

    使用block实现委托模式,其优点是回调的block代码块定义在委托对象函数内部,使代码更为紧凑;

    适配对象不再需要实现具体某个protocol,代码更为简洁。

    2 多线程与block

    GCD与Block

    使用 dispatch_async 系列方法,可以以指定的方式执行block

    GCD编程实例

    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();}); 

    相关文章

      网友评论

        本文标题:iOS之Block解刨分析

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