程序员

Runtime深入理解

2018-05-11  本文已影响30人  maker997

runtime 深入理解

常见的图标

icon

runtime 相关的文件

runtimeFiles

文件内容介绍

文件的结构图

* 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)

父类和子类的关系

  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
上一篇下一篇

猜你喜欢

热点阅读