美文网首页
runtime object_getClass 和 objc_g

runtime object_getClass 和 objc_g

作者: _RG | 来源:发表于2019-08-22 15:04 被阅读0次

    object_getClass

    The class object of which object is an instance, or Nil if object is nil.

    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的返回值The Class object for the named class, or nil if the class is not registered with the Objective-C runtime.

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

    1. class_getInstanceMethod

    获取一个类的对象方法

    4.class_getClassMethod

    获取一个类的类方法,

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

    - (void)name {
        
    }
    
    + (void)name {
        
    }
    

    objc_getMetaClass

    objc_getMetaClass 是获取一个类的元类对象,
    当object_getClass传入是类对象时,获取的也是元类对象
    此时objc_getMetaClass 和 object_getClass 获取的是同一个元类对象

    相关文章

      网友评论

          本文标题:runtime object_getClass 和 objc_g

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