runtime&runloop

runtime面试题

2019-03-18  本文已影响0人  毛晓林

一 面试题

1.讲一下 OC 的消息机制

OC中的方法调用其实都是转成了objc_msgSend函数的调用,给receiver(方法调用者)发送了一条消息(selector方法名)

objc_msgSend底层有3大阶段

消息发送(当前类、父类中查找)、动态方法解析、消息转发

2. 什么是Runtime?平时项目中有用过么?

OC是一门动态性比较强的编程语言,允许很多操作推迟到程序运行时再进行

OC的动态性就是由Runtime来支撑和实现的,Runtime是一套C语言的API,封装了很多动态性相关的函数

平时编写的OC代码,底层都是转换成了Runtime API进行调用

3.runtime具体应用

利用关联对象(AssociatedObject)给分类添加属性

遍历类的所有成员变量(修改textfield的占位文字颜色、字典转模型、自动归档解档)

交换方法实现(交换系统的方法)

利用消息转发机制解决方法找不到的异常问题

7.说说什么是runtime

1.OC 是一个全动态语言,OC 的一切都是基于 Runtime 实现的平时编写的OC代码, 在程序运行过程中, 其实最终都是转成了runtime的C语言代码, runtime算是OC的幕后工作者

比如:

OC :[[Person alloc] init]runtime :objc_msgSend(objc_msgSend("Person","alloc"),"init")

2.runtime是一套比较底层的纯C语言API, 属于1个C语言库, 包含了很多底层的C语言API

3.runtimeAPI的实现是用 C++ 开发的(源码中的实现文件都是mm),是一套苹果开源的框架

1.背景知识

1.1 OC的方法调用流程

下面以实例对象调用方法[blackDog walk]为例描述方法调用的流程:

1、编译器会把`[blackDog walk]`转化为`objc_msgSend(blackDog,SEL)`,SEL为@selector(walk)。

2、Runtime会在blackDog对象所对应的Dog类的方法缓存列表里查找方法的SEL

3、如果没有找到,则在Dog类的方法分发表查找方法的SEL。(类由对象isa指针指向,方法分发表即methodList)

4、如果没有找到,则在其父类(设Dog类的父类为Animal类)的方法分发表里查找方法的SEL(父类由类的superClass指向)

5、如果没有找到,则沿继承体系继续下去,最终到达NSObject类。

6、如果在234的其中一步中找到,则定位了方法实现的入口,执行具体实现

7、如果最后还是没有找到,会面临两种情况:

(1) 如果是使用`[blackDog walk]`的方式调用方法

(2) 使用`[blackDog performSelector:@selector(walk)]`的方式调用方法


2,消息转发流程

1、动态方法解析接收到未知消息时(假设blackDog的walk方法尚未实现),runtime会调用+resolveInstanceMethod:(实例方法)或者+resolveClassMethod:(类方法)

2、备用接收者如果以上方法没有做处理,runtime会调用- (id)forwardingTargetForSelector:(SEL)aSelector方法。如果该方法返回了一个非nil(也不能是self)的对象,而且该对象实现了这个方法,那么这个对象就成了消息的接收者,消息就被分发到该对象。适用情况:通常在对象内部使用,让内部的另外一个对象处理消息,在外面看起来就像是该对象处理了消息。比如:blackDog让女朋友whiteDog来接收这个消息

3、完整消息转发在- (void)forwardInvocation:(NSInvocation*)anInvocation方法中选择转发消息的对象,其中anInvocation对象封装了未知消息的所有细节,并保留调用结果发送到原始调用者。比如:blackDog将消息完整转发給主人dogOwner来处理


上一篇下一篇

猜你喜欢

热点阅读