美文网首页
OC对象的分类

OC对象的分类

作者: lockezhang78 | 来源:发表于2019-07-18 14:06 被阅读0次

    一、OC对象的类型有3种:

    instance对象(实列对象)、

    class对象(类对象)、

    meta-class对象(元类对象)

    二、instance对象(实列对象)

    instance对象就是通过类alloc出来的对象,每次调用alloc都会产生新的instance对象;

    创建出来的对象,在内存中存储的信息包含:成员变量、有一个共同的isa指针成员变量,它指向了该对象的首地址;

    三、class对象(类对象)

    NSObject *object1 = [[NSObject alloc] init];

    NSObject *object2 = [[NSObject alloc] init];

    获取类对象

            Class objectClass1 = [object1 class];

            Class objectClass2 = [object2 class];

            Class objectClass3 = object_getClass(object1);

            Class objectClass4 = object_getClass(object2);

            Class objectClass5 = [NSObject class];

    它们获取的结果都是同一个对象。每个类在内存中有且只有一个class对象;

    class对象在内存中存储的信息主要包括:

    isa指针

    supperclass指针

    类的属性信息(@property)

    类的对象方法信息(instance method)

    类的协议信息(protocol)

    类的成员变量信息(ivar),就是成员变量的描述信息,类型和名字等;

    类对象包含的信息

    四、meta-class对象(元类对象)

    获取元类对象

    // class对象,类对象

    //class方法返回的一直是class对象,类对象,不管你调用多少次class方法

            Class objectClass1 = [object1 class];

            Class objectClass2 = [object2 class];

            Class objectClass3 = object_getClass(object1);  // Runtime API

            Class objectClass4 = object_getClass(object2);  // Runtime API

            Class objectClass5 = [NSObject class];

    // meta-class对象,元类对象

    //将类对象当做参数传入,获得元类对象

    Class objectMetaClass = object_getClass(objectClass5); // Runtime API

    Class objectMetaClass2 = [[[NSObjectclass]class]class];

    它存储着类方法;

    它是一种特殊的Class对象,结构和类对象一样,但它内部的值,有些是null;

    用object_getClass(类对象),获取元类对象

    用class_isMetaClass(类对象),判断是否是元类对象,返回值为BOOL

    元类对象包含的信息

    五、object_getClass用内部实现

    1.Classobjc_getClass(const char *aClassName)

     1> 传入字符串类名

     2> 返回对应的类对象

    2.Classobject_getClass(id obj)

     1> 传入的obj可能是instance对象、class对象、meta-class对象

     2> 返回值

     a) 如果是instance对象,返回class对象

     b) 如果是class对象,返回meta-class对象

     c) 如果是meta-class对象,返回NSObject(基类)的meta-class对象

     3.- (Class)class、+ (Class)class

     1> 返回的就是类对象

    // 内部实现

     - (Class) {

         return self->isa;

     }

     + (Class) {

         return self;

     }

    六、isa指针

    isa指针指向哪里

    七、class对象的superclass指针

    类对象的superclass指向

    >>当Student的instance对象要调用Person的对象方法时,会先通过isa找到Student的class,然后通过superclass找到Person的class,最后找到对象方法的实现进行调用

    八、meta-class对象的superclass指针

    元类对象superclass指向

    >>当Student的class要调用Person的类方法时,会先通过isa找到Student的meta-class,然后通过superclass找到Person的meta-class,最后找到类方法的实现进行调用

    九、isa、superclass总结

    如果在基类的meta-class $对象中找不到对应的"+类方法",就会到基类的class对象中查找instance方法来进行调用;

    相关文章

      网友评论

          本文标题:OC对象的分类

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