接上文【iOS面试总结】疫情隔离中,线上面试的问题集合(第一部分)
6、Runtime
6.1 介绍下Runtime?
oc是一门动态语言,所谓动态语言就是在编译阶段无法确定调用的函数以及属性的类型,只有在运行阶段首次确定类型和调用的函数。
runtime就是动态语言下核心的一个库,底层都会通过obj_sendMsg来处理消息转发机制。也是因为拥有runtime使得oc语言灵活性比较强,能够具有动态、动态绑定、动态解析的特性。
总结:可在程序在运行时改变结构,如添加方法,交换方法等。
6.2 runtime调用流程?
1、当调用个对象的时候,会通过obj_oject的isa指针找对对应的归属类。
2、从归属类(obj_class)类中的obj_cache中寻找对应的相等的sel方法编号。
3、如果没有找到,继续obj_class中的obj_method_lish中查找,如果找到写入obj_cache中。
4、如果没有到找到,会一直找到它的元类上。
5、如果元类也没有的话,会调用消息动态解析方法(resovleInstace和resloveClass)的方法,查看是否存在绑定的方法。
6、如果没有绑定方法,会调用消息转发方法(forwardingTagert)的方法。查看是否存在转发对象。
7、如果没有存在消息转发对象,会调用(methodSinature)的方法,查看是否有方法签名返回类型和参数类型。
8、如果不存在签名方法和类型,就会崩溃,找不到方法。
9、存在签名的方法,就是继续执行forwardingInvocation方法,最后一次通知绑定对象寻找IMP地址。
10、如果在forwardingInvocation没有找到IMP,就会调用找不到方法。
6.3 消息发送的流程是怎样的?
OC中的方法调用会转化成给对象发送消息,发送消息会调用这个方法:
objc_msgSend(receiver, @selector(message))
该过程有以下关键步骤:
1、先确定调用方法的类已经都加载完毕,如果没加载完毕的话进行加载
2、从cache中查找方法
3、cache中没有找到对应的方法,则到方法列表中查,查到则缓存
4、如果本类中查询到没有结果,则遍历所有父类重复上面的查找过程,直到NSObject
6.4 runtime如何通过selector找到对应的IMP地址?
每一个类对象中都一个方法列表,方法列表中记录着方法的名称,方法实现,以及参数类型,其实selector本质就是方法名称,通过这个方法名称就可以在方法列表中找到对应的方法实现.
7、Runloop
7.1 Runloop的运行模式有哪些?
RunLoop的运行模式共有5种,RunLoop只会运行在一个模式下,要切换模式,就要暂停当前模式,重写启动一个运行模式
1、kCFRunLoopDefaultMode, App的默认运行模式,通常主线程是在这个运行模式下运行
2、UITrackingRunLoopMode, 跟踪用户交互事件(用于 ScrollView 追踪触摸滑动,保证界面滑动时不受其他Mode影响)
3、kCFRunLoopCommonModes, 伪模式,不是一种真正的运行模式
4、UIInitializationRunLoopMode:在刚启动App时第进入的第一个Mode,启动完成后就不再使用
5、GSEventReceiveRunLoopMode:接受系统内部事件,通常用不到
7.2 介绍下Runloop的内部逻辑
8、Block
9、App与H5交互
10、设计模式
11、MVC 和 MVVM
12、iOS基础知识掌握
文章来源: 博客园
- 还没有人评论,欢迎说说您的想法!