Runtime底层各个结构体
2017-09-06 本文已影响155人
lionsom_lin
一、Objective-C消息传递
[object foo];
分析:
1.1、这个过程并非立刻指向foo的内存开始执行,而且有个一传递的过程,让我们有机可乘。
1.2、执行的时候给object发送了一个foo的消息
[people TailName:@"name" Age:19];
类似于:C语言的
obj_msgSend(people,@selector(TailName: Age:));
两个头文件库
#import <objc/objc.h>
#import <objc/runtime.h> //C写的库
在OC中,类、对象和方法都是一个�C的结构体
/// An opaque type that represents an Objective-C class.
typedef struct objc_class *Class;
/// Represents an instance of a class.
struct objc_object {
Class isa OBJC_ISA_AVAILABILITY;
};
/// A pointer to an instance of a class.
typedef struct objc_object *id;
结论:Class是一个objc_class结构类型的指针,Id是一个objc_object结构类型的指针。
objc_class结构体
struct objc_class {
Class isa OBJC_ISA_AVAILABILITY;
#if !__OBJC2__
Class super_class OBJC2_UNAVAILABLE;
const char *name OBJC2_UNAVAILABLE;
long version OBJC2_UNAVAILABLE;
long info OBJC2_UNAVAILABLE;
long instance_size OBJC2_UNAVAILABLE;
struct objc_ivar_list *ivars OBJC2_UNAVAILABLE;
struct objc_method_list **methodLists OBJC2_UNAVAILABLE;
struct objc_cache *cache OBJC2_UNAVAILABLE;
struct objc_protocol_list *protocols OBJC2_UNAVAILABLE;
#endif
} OBJC2_UNAVAILABLE;
结论:
- isa
Class类型的指针,实例对象有个isa的属性,指向Class,而Class里也有isa属性,指向meteClass。
OC中的任何类的定义都是对象 - super class
指向该类的父类,如果该类已经是最顶层的根类(NSObjuect),那么super_class就是NULL - name
类的名字 - version
类的版本信息 - info
提供运行时期使用的一些位标识 - instance_size
该类的实例变量的大小 - vars
成员变量的链表
struct objc_ivar_list {
int ivar_count
struct objc_ivar ivar_list[1]
}
- methodLists
方法定义的链表
struct objc_method_list {
struct objc_method_list *obsolete
int method_count
struct objc_method method_list[1]
}
struct objc_method {
SEL method_name
char *method_types
IMP method_imp
}
- cache
指向最近使用的方法,是一种优化机制,用于方法调用的优化 - protocols
协议链表
struct objc_protocol_list {
struct objc_protocol_list *next;
long count;
__unsafe_unretained Protocol *list[1];
};
注:objc_method_list本质是一个有objc_method元素的链表,一个objc_method结构体中。
- 函数名,也就是SEL
- 表示函数原型的字符串
- 函数的实现IMP(地址)
二、Xmind总结
Xmind文件:https://github.com/lionsom/LXRunTimeAll
三、方法调配(OC的机制,只存在OC)Method Swizzling
涉及到的主要方法:
- class_addMethod
- class_replaceMethod
- method_exchageImplementation