Runtime深入理解

runtime 深入理解

常见的图标

Runtime深入理解_第1张图片
icon

runtime 相关的文件

Runtime深入理解_第2张图片
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深入理解_第3张图片
      runtime_struct
* runtime.h 定义的类型
    ![runtime_typedef](http://upload-images.jianshu.io/upload_images/1672898-5ac1dae5dbba9957.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

* runtime.h 定义的 C 函数
![image](http://upload-images.jianshu.io/upload_images/1672898-ea029cab8e84a7b7.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
  • objc.h文件中定义


    Runtime深入理解_第4张图片
    obj
  • NSObject.h


    Runtime深入理解_第5张图片
    NSObject_file
    • NSObject协议的内容


      Runtime深入理解_第6张图片
      NSObject_protoco
    • NSObject类中包含的方法


      Runtime深入理解_第7张图片
      NSObject_class
  • message.h文件


    Runtime深入理解_第8张图片
    message
  • NSObjCRuntime.h文件


    Runtime深入理解_第9张图片
    NSObjCRuntime

父类和子类的关系

  1. 在objc.h文件中定义了 Class类型是指向 objc_class 结构体的指针

        typedef struct objc_class *Class;
    
  2. 在 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; //遵守的协议列表
    };
    
  3. 父类与子类的关系图


    Runtime深入理解_第10张图片
    baseClass_subClass
  4. 代码证明证明关系图

    • 动态创建一个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]));
    }
    

消息机制

Runtime深入理解_第11张图片
icon

你可能感兴趣的:(Runtime深入理解)