接上文【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基础知识掌握

内容来源于网络如有侵权请私信删除

文章来源: 博客园

原文链接: https://www.cnblogs.com/xjf125/p/16180167.html

你还没有登录,请先登录注册
  • 还没有人评论,欢迎说说您的想法!