美文网首页
通过源码分析oc中的类和元类

通过源码分析oc中的类和元类

作者: J扣歪 | 来源:发表于2020-11-30 17:18 被阅读0次
一 、如何获取 类
+ (Class)class {
    return self;
}

1)通过调用类方法+ (Class)class直接返回self也就是类本身

- (Class)class {
    return object_getClass(self);
}

Class object_getClass(id obj)
{
    if (obj) return obj->getIsa();
    else return Nil;
}

2)通过调用对象的实例方法- (Class)class,然后再通过object_getClass返回这个实例对象的isa所指向的类

Class objc_getClass(const char *aClassName)
{
    if (!aClassName) return Nil;

    // NO unconnected, YES class handler
    return look_up_class(aClassName, NO, YES);
}

3)objc_getClass 通过look_up_class去查找一个以传入的字符命名的类并返回

二 、如何获取 元类

Class objc_getMetaClass(const char *aClassName)
{
    Class cls;

    if (!aClassName) return Nil;

    cls = objc_getClass (aClassName);
    if (!cls)
    {
        _objc_inform ("class `%s' not linked into application", aClassName);
        return Nil;
    }

    return cls->ISA();
}

通过objc_getMetaClass可以获取到一个以传入的字符命名的类的元类,由源码可以看出它是先通过cls = objc_getClass (aClassName);获取到一个类cls,然后忽略获取失败的情况最终通过return cls->ISA();返回了这个类cls的ISA所指向的类。

一 、验证

为了验证上面的描述是否正确

@interface Person : NSObject
@end

@interface Student : NSObject
@end

1)创建两个类Person和Student

- (void)viewDidLoad {
    [super viewDidLoad];
    NSLog(@"改变前---%@",objc_getMetaClass("Person"));
    object_setClass([Person class], [Student class]);
    NSLog(@"改变后---%@",objc_getMetaClass("Person"));
}

2)通过object_setClass这句代码可以将一个对象的isa所指向的类赋值成其他的类,现在传入一个类对象Person[Person class],让后将它的isa所指向的类变成Student,最终在控制台比较一下改变前后Person的元类的打印情况。

2020-11-30 16:43:39.038771+0800 Method[3413:231818] 改变前---Person
2020-11-30 16:43:54.842909+0800 Method[3413:231818] 改变后---Student

3)可以看出objc_getMetaClass将Person的元类由Person变成了Student,所以说如果类表示的是一个实例对象的isa所指向的类,那么元类表示的就是一个类对象的isa所指向的类,默认情况下一个类的元类就是它本身。

相关文章

  • 通过源码分析oc中的类和元类

    一 、如何获取 类 1)通过调用类方法+ (Class)class直接返回self也就是类本身 2)通过调用对象的...

  • iOS 类原理探索:类的结构分析

    OC 类原理探索 系列文章 OC 类原理探索:类的结构分析 OC 类原理探索:类结构分析补充[https://ju...

  • OC底层-类和对象

    类和对象 OC中的类 OC中.类基于C/C++的结构体. 通过查看NSObject的类定义,可以看到内部有一个Cl...

  • Runtime:OC对象、类、元类的本质

    零、Runtime是什么一、OC对象的本质二、OC类的本质三、OC元类的本质四、Runtime关于对象、类、元类的...

  • 三:类内存结构--知识扩展

    上课知识回顾: 证明:对象方法存在类里面,类方法存在元类里面!!!!! 源码分析: class_getInstan...

  • iOS底层原理之六:isa指针实现之ISA_MASK

    题记 前面我们提到,在OC对象中实例对象的isa是指向类对象,类对象的isa指向元类对象,这样我们可以通过isa把...

  • iOS方法缓存和查找

    方法缓存的查找和cache的读写操作 在苹果提供的oc底层源码中,可以看到类的结构,isa是指向类和原类,supe...

  • OC中的实例、类、元类、分类和类扩展

    一、 OC的实例 实例或者说是对象实例本质是一个结构体: 而每一个对象都有一个类,而对象中的isa指针,指向对象所...

  • iOS runtime

    文章目录 OC中类和对象的本质 实例对象,类,元类的关系 类的属性 类的方法 消息发送机制 Runtime api...

  • 关于Runtime一切

    1.理解NSObject和元类 1.1 在OC中的对象和类是什么 对象是在objc.h中定义的 类是在runtim...

网友评论

      本文标题:通过源码分析oc中的类和元类

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