runtime 1 - 基本概念
Objective-c
- 动态语言,把静态语言(c c++)在编译和链接时候做的事情放到运行时来做,
- 可以在运行时把消息发送给想要的对象,交换某一个方法的实现。
Rumtime 运行时
- 在编译阶段Objc可以调用任何对象,即使对象并未创建,只要声明过就不会报错。
- 能在运行时创建类和对象。
- 在运行时根据方法名称找到对应的方法去调用。
动态调用
-
接受对象接受消息后,通过isa指针查找相应此消息的对象。
[objc mySelector]
- objc是对象,mySelector是方法名称
- 转换为
objc_msgsend(obj, @selector(mySelector))
, - 通过obj对象的isa指针查找obj对应的Class, 先去Class的cache中查找SEL对应的method,如果有调用,
- 没有就去methodList中查找,如果methodList中没有,去superClass,找到后调用,并存入cache,方便下次调用。
- 流程图:
- 发送消息:
- 对象,在对象所属的类方法列表中查找对应的方法。
- 类,在类的meta-class方法列表中查找。
meta-class 元类
-
类自身也是对象,可以像对象发送消息
即调用类方法,eg:NSArray *array = [NSArray array])
-
存储着一个类的所有类方法,每个类都有一个单独的meta-class
-
meta-class的isa指向基类,基类的isa指向自己,eg:
NSObject下的meta-class都使用NSObject自己的meta-class作为其所属类
Class
- NSObject
- Class 表示类,是一个objc_class结构体的指针
定义为: typedef struct objc_class *Class
- objc_class结构体: