iOS高级开发工程师面试——RunTime
iOS高级开发工程师面试——RunTime
- 一、简介
- 二、介绍下 RunTime 的内存模型(isa、对象、类、metaclass、结构体的存储信息等)
- 对象
- 类
- 三、为什么要设计 metaclass ?
- 四、class_copyIvarList & class_copyPropertyList区别?
- 五、class_rw_t 和 class_ro_t 的区别?
- 六、category如何被加载的?两个 category 的load方法的加载顺序?两个 category 的同名方法的加载顺序?
- 七、category & extension区别?能给 NSObject 添加 Extension 吗?结果如何?
- 八、 消息转发机制,消息转发机制和其他语言的消息机制优劣对比?
- 九、在方法调用的时候,方法查询-> 动态解析-> 消息转发 之前做了什么 ?
- 十、IMP、SEL、Method的区别和使用场景
- 十一、load、initialize方法的区别什么?在继承关系中他们有什么区别?
- 十二、说说消息转发机制的优劣?
- 十二、iOS你在项目中用过 RunTime 吗?举个例子。
- 十三、RunTime 是如何把 weak变量的自动置 nil 的?
- 十四、objc中向一个 nil 对象发送消息将会发生什么?
一、简介
Objective-C
语言是一门动态语言。它把一些决策从编译阶段
、链接阶段
推迟到运行时
阶段,实现该机制的基础就是 runtime
(又叫作运行时)。
Runtime 提供的接口基本都是 C 语言,源码由 C\C++\汇编语言编写。Runtime API 为 Objective-C 语言的动态属性提供支持,充当一种用于 Objective-C 语言的操作系统,使得该语言正常运转工作。
二、介绍下 RunTime 的内存模型(isa、对象、类、metaclass、结构体的存储信息等)
对象
OC中的对象指向的是一个objc_object
指针类型,typedef struct objc_object *id
;从它的结构体中可以看出,它包括一个isa
指针,指向的是这个对象的类对象,一个对象实例就是通过这个isa
找到它自己的Class
,而这个Class
中存储的就是这个实例的方法列表、属性列表、成员变量列表等相关信息的。
/// Represents an instance of a class.
struct objc_object {Class _Nonnull isa OBJC_ISA_AVAILABILITY;
};
类
在OC中的类是用Class
来表示的,实际上它指向的是一个objc_class
的指针类型,typedef struct objc_class *Class
;对应的结构体如下:
struct objc_class {Class _Nonnull isa OBJC_ISA_AVAILABILITY;#if !__OBJC2__Class _Nullable super_class OBJC2_UNAVAILABLE;const char * _Nonnull name OBJC2_UNAVAILABLE;long version OBJC2_UNAVAILABLE;long info OBJC2_UNAVAILABLE;long instance_size OBJC2_UNAVAILABLE;struct objc_ivar_list * _Nullable ivars OBJC2_UNAVAILABLE;struct objc_method_list * _Nullable * _Nullable methodLists OBJC2_UNAVAILABLE;struct objc_cache * _Nonnull cache OBJC2_UNAVAILABLE;struct objc_protocol_list * _Nullable protocols OBJC2_UNAVAILABLE;#endif}
从结构体中定义的变量可知,OC的Class类型包括如下数据(即:元数据metadata
):super_class(父类类对象)
;
name(类对象的名称)
;
version、info(版本和相关信息)
;
instance_size(实例内存大小
);
ivars(实例变量列表)
;
methodLists(方法列表)
;
cache(缓存)
;
protocols(实现的协议列表)
;
当然也包括一个isa指针
,这说明Class
也是一个对象类型,所以我们称之为类对象
,这里的isa指向的是元类对象(metaclass),元类中保存了创建类对象(Class)的类方法的全部信息。
以下图中可以清楚的了解到OC对象、类、元类之间的关系:
从图中可知:
对象的isa
指针指向类
,类对象
的isa指针指向元类
,元类对象
的isa指针指向根元类
,根元类
的isa指针指向他本身
,从而形成一个闭环。
元类(Meta Class):是一个类对象的类,即:Class的类,这里保存了类方法等相关信息。
我们再看一下类对象中存储的方法
、属性
、成员变量
等信息的结构体:
- objc_ivar_list
存储了类的成员变量,可以通过object_getIvar
或class_copyIvarList<