ios 经典面试案例 (九)

main()之前的过程有哪些?
  • main之前的加载过程
    1)dyld 开始将程序二进制文件初始化
    2)交由ImageLoader 读取 image,其中包含了我们的类,方法等各种符号(Class、Protocol 、Selector、 IMP)
    3)由于runtime 向dyld 绑定了回调,当image加载到内存后,dyld会通知runtime进行处理
    4)runtime 接手后调用map_images做解析和处理
    5)接下来load_images 中调用call_load_methods方法,遍历所有加载进来的Class,按继承层次依次调用Class的+load和其他Category的+load方法
    6)至此 所有的信息都被加载到内存中
    7)最后dyld调用真正的main函数
sa指针?(对象的isa,类对象的isa,元类的isa都要说)

对象的isa指针指向所属的类

类的isa指针指向了所属的元类
元类的isa指向了根元类,根元类指向了自己。

image
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: 也会被调用。

题的搬运,不成敬意!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。