iOS开发(4)OC对象的分类

作者: 迷心迷 | 来源:发表于2019-04-02 19:35 被阅读146次

一、Objective-C中的对象,简称OC对象,主要可以分为3种

  • instance对象(实例对象)
  • class对象(类对象)
  • meta-class对象(元类对象)

二、instance

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

NSObject *obj1 = [[NSObject alloc] init];
NSObject *obj2 = [[NSObject alloc] init];
  • object1、object2是NSObject的instance对象(实例对象)
  • 它们是不同的两个对象,分别占据着两块不同的内存
  • instance对象在内存中存储的信息包括
    isa指针
    其他成员变量
1.png 2.png

三、class

3.png
  • objectClass1 ~ objectClass5都是NSObject的class对象(类对象)
  • 它们是同一个对象。每个类在内存中有且只有一个class对象
  • class对象在内存中存储的信息主要包括
    isa指针
    superclass指针
    类的属性信息(@property)、类的对象方法信息(instance method)
    类的协议信息(protocol)、类的成员变量信息(ivar)
4.png

四、meta-class

5.png
  • objectMetaClass是NSObject的meta-class对象(元类对象)

  • 每个类在内存中有且只有一个meta-class对象

  • meta-class对象和class对象的内存结构是一样的,但是用途不一样,在内存中存储的信息主要包括
    isa指针
    superclass指针
    类的类方法信息(class method)

6.png

五、注意

  • 以下代码获取的objectClass是class对象,并不是meta-class对象


    7.png
  • 查看Class是否为meta-class


    8.png
  • object_getClass与objc_getClass的区别
    1.Class objc_getClass(const char *aClassName)
    1> 传入字符串类名
    2> 返回对应的类对象

    2.Class object_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
    返回的就是类对象

    -(Class) {
    return self->isa;
    }

    +(Class) {
    return self;
    }

六、isa

9.png
  • instance的isa指向class
    当调用对象方法时,通过instance的isa找到class,最后找到对象方法的实现进行调用

  • class的isa指向meta-class
    当调用类方法时,通过class的isa找到meta-class,最后找到类方法的实现进行调用

七、superclass

1、 class对象的superclass指针


10.png

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

2、 meta-class对象的superclass指针


11.png

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

3、 isa、superclass总结

  • instance的isa指向class
  • class的isa指向meta-class
  • meta-class的isa指向基类的meta-class
  • class的superclass指向父类的class
    如果没有父类,superclass指针为nil
  • meta-class的superclass指向父类的meta-class
    基类的meta-class的superclass指向基类的class
  • instance调用对象方法的轨迹
    isa找到class,方法不存在,就通过superclass找父类
  • class调用类方法的轨迹
    isa找meta-class,方法不存在,就通过superclass找父类


    12.png

八、class的结构

1、isa指针


13.png
  • 从64bit开始,isa需要进行一次位运算,才能计算出真实地址
14.png

2、objc4源码下载

3、窥探struct objc_class的结构


16.png

九、面试题

1、对象的isa指针指向哪里?
instance对象的isa指向class对象
class对象的isa指向meta-class对象
meta-class对象的isa指向基类的meta-class对象

2、OC的类信息存放在哪里?
对象方法、属性、成员变量、协议信息,存放在class对象中
类方法,存放在meta-class对象中
成员变量的具体值,存放在instance对象

相关文章

网友评论

    本文标题:iOS开发(4)OC对象的分类

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