runtime 深入理解
常见的图标
iconruntime 相关的文件
runtimeFiles文件内容介绍
- 每个文件主要都写这三种信息.
结构体
,给结构体重命名自定义类型
,C 函数
-
runtime.h
中几乎 runtime相关的函数都定义在这个文件中.主要包含Object
,objc
,protocol
,Class
,Ivar
,property
,关联对象
,Method
,SEL
等几个方面的函数和结构定义 -
objc.h
文件中主要写了类型的定义.Class
,id
,SEL
,BOOL
等类型,还有几个SEL
,object
相关的函数 -
NSObject.h
文件定义'NSObject'类的对象方法,类方法和'NSObject'协议的包含的属性,方法等. -
message.h
主要定义的消息发送的函数和'objc_super'的定义 -
NSObjCRuntime.h
中定义了字符串和'SEL','Class','protocol'之间转化的方法
文件的结构图
-
runtime.h 文件结构图
[图片上传失败...(image-2fc676-1526030915459)]-
runtime.h定义的结构体
runtime_struct
-
* runtime.h 定义的类型
![runtime_typedef](https://img.haomeiwen.com/i1672898/5ac1dae5dbba9957.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
* runtime.h 定义的 C 函数
![image](https://img.haomeiwen.com/i1672898/ea029cab8e84a7b7.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
-
objc.h文件中定义
obj -
NSObject.h
NSObject_file-
NSObject协议的内容
NSObject_protoco -
NSObject类中包含的方法
NSObject_class
-
-
message.h文件
message -
NSObjCRuntime.h文件
NSObjCRuntime
父类和子类的关系
-
在objc.h文件中定义了 Class类型是指向 objc_class 结构体的指针
typedef struct objc_class *Class;
-
在 runtime.h文件定义了 objc_class结构体
struct objc_class { Class isa; //指向其元类的 objc_class Class super_class; //指向父类的 objc_class const char *name; //名称 long version; long info; long instance_size; struct objc_ivar_list *ivars; //成员变量 struct objc_method_list **methodLists; //method列表 struct objc_cache *cache; //方法缓存 struct objc_protocol_list *protocols; //遵守的协议列表 };
-
父类与子类的关系图
baseClass_subClass -
代码证明证明关系图
- 动态创建一个NSError的子类,增加一个 testMetaClass对应的实现
- (void)ex_registerClassPair { Class newClass = objc_allocateClassPair([NSError class], "TestClass", 0); class_addMethod(newClass, @selector(testMetaClass), (IMP)TestMetaClass, "v@:"); //只能注册一次 objc_registerClassPair(newClass); id instance = [[newClass alloc] initWithDomain:@"some domain" code:0 userInfo:nil]; [instance performSelector:@selector(testMetaClass)]; }
-
BOOL class_addMethod(Class cls, SEL name, IMP imp, const char *types)
方法的介绍- 针对系统提供的类例如 UIButton添加方法是不成功的
- 参数 cls 要添加方法的类
- 参数 imp 方法的实现,已有的方法可以通过method_getImplementation()获取,自定义的函数传函数名
- 参数 types 是对实现函数的返回值和参数的类型编码.对于已有的方法通过method_getTypeEncoding()获取,自定义的函数编码看这里
-
testMetaClass的实现
void TestMetaClass(id self,SEL _cmd) { NSLog(@"this object is %p",self); NSLog(@"Class is %@,super class is %@",[self class],[self superclass]); Class currentClass = [self class]; for (int i = 0; i < 4; i++) { NSLog(@"Following the isa pointer %d times gives %p",i,currentClass); currentClass = object_getClass(currentClass); } NSLog(@"NSObject's class is %p",[NSObject class]); NSLog(@"NSObject's meta class is %p",object_getClass([NSObject class])); }
网友评论