美文网首页
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