美文网首页分类iOS小知识点底层开发-基础知识
iOS 实例对象,类对象,元类对象(1)

iOS 实例对象,类对象,元类对象(1)

作者: 枫紫_6174 | 来源:发表于2020-09-22 16:36 被阅读0次

OC对象的分类

OC对象主要分为三类:instance(实例对象),class (类对象),meta-class(元类对象)

  • 实例对象:

    实例对象就是通过类调用alloc来产生的instance,每一次调用的alloc都是产生新的实例对象,内存地址都是不一样的,占据着不同的内存 eg:
        NSObject *objc1 = [[NSObject alloc]init];
        NSObject *objc2 = [[NSObject alloc]init];
        
        NSLog(@"instance----%p %p",objc1,objc2);
输出结果: 实例对象
  • instance实例对象存储的信息:
    1.isa指针

    2.其他成员变量 实例对象的内存结构
    我们平时说打印出来的实例对象的地址开始就是指的是isa的地址,即isa的地址排在最前面,就是我们实例对象的地址
  • 类对象

  • 类对象的获取
        Class Classobjc1 = [objc1 class];
        Class Classobjc2 = [objc2 class];
        Class Classobjc3 = object_getClass(objc1);
        Class Classobjc4 = object_getClass(objc2);
        Class Classobjc5 = [NSObject class];
        NSLog(@"class---%p %p %p %p %p ",Classobjc1,Classobjc2,Classobjc3,Classobjc4,Classobjc5);

打印结果

2020-09-22 15:48:00.125034+0800 OC底层[1095:69869] class---0x7fff9381e140 0x7fff9381e140 0x7fff9381e140 0x7fff9381e140 0x7fff9381e140

从打印的结果我们可以看到,所有指针指向的类对象的地址是一样的,也就是说一个类的类对象只有唯一的一个

  • 类对象的作用

类对象存储的信息:
1.isa指针
2.superclass指针
3.类的方法(method,即减号方法),类的属性(@property),协议信息,成员变量信息(这里的成员变量不是指的值,因为每个对象的值是由每个实例对象所决定的,这里指的是成员变量的类型,比如整形,字典,字符串,以及成员变量的名字)


类存储结构
  • 元类对象

1.元类对象的获取

        Class metaObjc1 = object_getClass([NSObject class]);
        Class metaObjc2 = object_getClass(Classobjc1);
        Class metaObjc3 = object_getClass(Classobjc3);
        Class metaObjc4 = object_getClass(Classobjc5);

打印指针地址

NSLog(@"meta---%p %p %p %p",metaObjc1,metaObjc2,metaObjc3,metaObjc4);
2020-09-22 16:12:10.191008+0800 OC底层[1131:77555] instance----0x60000000c2e0 0x60000000c2f0
2020-09-22 16:12:10.191453+0800 OC底层[1131:77555] class---0x7fff9381e140 0x7fff9381e140 0x7fff9381e140 0x7fff9381e140 0x7fff9381e140
2020-09-22 16:12:10.191506+0800 OC底层[1131:77555] meta---0x7fff9381e0f0 0x7fff9381e0f0 0x7fff9381e0f0 0x7fff9381e0f0

获取元类对象的方法就是利用runtime方法,传入类对象,就可以获取该类的元类对象,从打印的结果可以看出,所有的指针地址一样,也就是说一个类的元类只有唯一的一个

特别注意一点:

Class objc = [[NSObject class] class];
Class objcL = [[[NSObject class] class] class];

无论class几次,它返回的始终是类对象

2020-09-22 16:21:11.065008+0800 OC底层[1163:81105] objcClass---0x7fff9381e140--0x7fff9381e140

元类存储结构:
元类的存储结构和类存储结构是一样的,但是存储的信息和用途不一样,元类的存储信息主要包括:
1.isa指针
2.superclass指针
3.类方法(即加号方法)


元类存储结构

从图中我们可以看出元类的存储结构和类存储结构一样,只是有一些值为空

  • 判断是否为元类
    class_isMetaClass(objcL);

关于类对象和元类对象为什么都有isa和superclass,将在接下来的文章中讲出

相关文章

  • iOS内存分配

    iOS对象有3种: 实例对象 类对象 元类对象 对象(对象都是结构体)的内存中,包含的指针: isa 实例对象is...

  • iOS 实例对象,类对象,元类对象(1)

    OC对象的分类 OC对象主要分为三类:instance(实例对象),class (类对象),meta-class(...

  • RunTime底层原理

    1.isaisa:实例对象的isa指向类对象,类对象的isa指向元类对象。元类对象isa执行基类元类对象。2.方法...

  • iOS-对象、isa指针、SuperClass

    OC中对象分类 分为三类:实例对象、类对象、元类对象 instance对象(实例对象) class对象(类对象) ...

  • iOS类的结构分析

    一、实例对象、类、元类关系分析 1. 实例对象、类、元类关系图解析 我相信上面这张经典的实例对象、类、元类关系图大...

  • oc对象实现图解

    ios第一篇(oc对象) ios类对象和元类对象以及对象的关系 类对象中存储的是对象的实例方法,属性,成员变量,协...

  • OC对象学习(实例对象、类对象、元类对象)

    1).OC对象分类: 实例对象(Instance对象) 类对象(Class对象) 元类对象(Meta-class对...

  • isa 和 superclass

    实例对象的 isa 指向类对象,类对象的 isa 指向元类对象,元类的isa 指向基类的元类对象,基类的元类对象的...

  • Object-C 方法查找原理(对象、isa和SuperClas

    Q:OC中对象分类 A:总共为三类:实例对象、类对象、元类对象 instance对象(实例对象) class对象(...

  • iOS runtime注意事项(持续改进中)

    1、分清类和对象: 对象:类的实例。instance。 类:也是对象,元类的对象:metaClass’s inst...

网友评论

    本文标题:iOS 实例对象,类对象,元类对象(1)

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