runtime-object_getClass 和 objc_getClass

  1. object_getClass

class方法是通过一个类对象或实例对象来获取类
object_getClass是获取一个类的元类或根元类, 是通过isa获取
isa本身就是class类型
每个对象里面还有一个 super_class 指针,指向父类, 注意和元类指针区分开来

Class isa,
Class  super_class      
   Class current = [ViewController class];
    NSLog(@"current = %@--%p",NSStringFromClass(current),current);

    Class baseClass = object_getClass(current);
    NSLog(@"baseClass = %@--%p",NSStringFromClass(baseClass),baseClass);
    Class class02 = object_getClass(baseClass);
    NSLog(@"class02 = %@--%p",NSStringFromClass(class02),class02);
    Class class03 = object_getClass(class02);
    NSLog(@"class03 = %@--%p",NSStringFromClass(class03),class03);

打印结果

TESTRuntime[13422:297689] current = ViewController--0x10a3c1dd8
TESTRuntime[13422:297689] baseClass = ViewController--0x10a3c1e00
TESTRuntime[13422:297689] class02 = NSObject--0x10b459ee8
TESTRuntime[13422:297689] class03 = NSObject--0x10b459ee8

分析得出: current 是ViewController类对象,
baseClass得到的是ViewController的元类对象,名字是一样的,但是地址却不一样
class02和class03都是根元类对象的地址
class03的地址证实了根源类指向自己,形成闭环

与objc_getClass的不同

objc_getClass是根据传入的字符串,获取这个字符串对应的类对象

  1. class_replaceMethod
// 替代方法的实现
IMP class_replaceMethod ( Class cls, SEL name, IMP imp, const char *types );

class_replaceMethod函数,该函数的行为可以分为两种:如果类中不存在name指定的方法,则类似于class_addMethod函数一样会添加方法;如果类中已存在name指定的方法,则类似于method_setImplementation一样替代原方法的实现。

注意,如果替换了父类的方法, 但是子类自己实现了父类的方法, 则子类的方法没有钓到父类时, 子类的方法不会被替换

  1. class_getInstanceMethod

获取一个类的对象方法

4.class_getClassMethod

获取一个类的类方法,

使用时注意, 编码中可以同时存在同名的对象和类方法, 且必须是有实现才行, 如果仅仅是声明, 则获取不到 例如

- (void)name {
    
}

+ (void)name {
    
}

你可能感兴趣的:(runtime-object_getClass 和 objc_getClass)