美文网首页程序员
Runtime深入理解

Runtime深入理解

作者: maker997 | 来源:发表于2018-05-11 17:28 被阅读30次

    runtime 深入理解

    常见的图标

    icon

    runtime 相关的文件

    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

    父类和子类的关系

    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. 父类与子类的关系图


      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]));
      }
      

    消息机制

    icon

    相关文章

      网友评论

        本文标题:Runtime深入理解

        本文链接:https://www.haomeiwen.com/subject/ysxqdftx.html