一步一脚印,iOS真实面试题整理

1.KVO实现原理?

####KVO基本原理:

1.KVO是基于runtime机制实现的;

2.当某个类的属性对象第一次被观察时,系统就会在运行期动态地创建该类的一个派生类,在这个派
生类中重写基类中任何被观察属性的setter 方法。派生类在被重写的setter方法内实现真正的通
知机制;

3.如果原类为Person,那么生成的派生类名为NSKVONotifying_Person;

4.每个类对象中都有一个isa指针指向当前类,当一个类对象的第一次被观察,那么系统会偷偷将
isa指针指向动态生成的派生类,从而在给被监控属性赋值时执行的是派生类的setter方法;

5.键值观察通知依赖于NSObject 的两个方法: willChangeValueForKey: 和 
didChangevlueForKey:;在一个被观察属性发生改变之前, willChangeValueForKey:一定会被
调用,这就 会记录旧的值。而当改变发生后,didChangeValueForKey:会被调用,继而 
observeValueForKey:ofObject:change:context: 也会被调用。

2.说说你理解的埋点?

####下面文章是对埋点的基本阐述
http://ios.jobbole.com/85746/

3.消息转发机制原理?

####消息转发机制基本分为三个步骤:

1、动态方法解析

2、备用接受者

3、完整转发
#### 动态方法解析:

对象在收到无法解读的消息之后,首先将调用所属类的下列类方法:

+(BOOL)resolveInstanceMethod:(SEL)sel;

该方法的参数就是那个未知的选择子,其返回值为布尔类型,表示这个类是否能新增一个实例方法用
以处理此选择子。在继续往下执行转发机制之前,本类有一个机会处理此选择子方法。假如是一个类
方法,那么将会调用另外一个方法,:

+(BOOL)resolveClassMethod:(SEL)sel;



#### 备用接收者:

当前接收者还有第二次机会处理未知的选择子,在这一步中,运行期系统会询问是否能将该消息转发给其他的接收者处理。对应的方法如图3:

[图片上传中...(image-c64987-1520500951842-1)]

参数为未知的选择子,如当前接收者能找到备援对象,则将其返回,找不到就返回nil。通过此方案,我们可以用“组合”来模拟出“多重继承”的某些特性。在一个对象内部,可能还有一系列其他对象,该对象可以经由此方法将能够处理某选择子的相关内部对象返回,这样的话,在外界看来好像是该对象亲自处理了这些消息。

#### 完整的消息转发:

如果转发已经到了这一步,那么唯一能做的就是启动完整的消息转发机制了。首先创建NSIvocation对象,把尚未处理的那条消息有关的细节全部封到其中。此对象包含选择子、目标、参数。在出发NSIvocation对象时,”消息派发系统“将亲自出马,把消息指派给目标对象。会调用图4的方法来转发消息:

[图片上传中...(image-e88962-1520500951842-0)]

这个方法的实现可以写的很简单,只需要改变调用目标,使消息在新目标上得以调用即可。然而这样实现出来的方法与”备援接收者“反感所实现的方法等效,所以很少有人采用这么简单的实现方式。比较有用的实现方式为:在触发消息前,先以某种方式改变消息内容,比如追加另外一个参数,或者是改换选择子等等。实现此方法时若发现不应该由本类处理,则需要调用超类的同名方法。这样的话,集成体系中的每个类都有机会处理此调用请求,直至NSObject。如果最后调用了NSObject类的方法,那么该方法还会继而调用”doesNotRecognizeSelector:“以抛出异常,此异常表明选择子最终未能得到处理。

你可能感兴趣的:(一步一脚印,iOS真实面试题整理)