美文网首页
Objective-C对象的分类与isa指针

Objective-C对象的分类与isa指针

作者: Y_van | 来源:发表于2018-08-30 09:36 被阅读7次

    OC对象的分类

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

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

    instance

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

    instance获取方式:

    NSObjcet *object1 = [[NSObjcet alloc] init];
    NSObjcet *object2 = [[NSObjcet alloc] init];
    // 打印地址可发现分别占据着两块不同的内存
    
    

    特性:object1和object2都是NSObject的instace对象(实例对象),
    但他们是不同的两个对象,并且分别占据着两块不同的内存。

    instance对象在内存中存储的信息包括:

    1. isa指针
    2. 其他成员变量

    为什么所有成员变量里都有isa?

    答,因为OC类都继承自NSObject

    class对象

    类对象特性:一个类的类对象是唯一的,在内存中是同一个的。

    类对象获取方式:

    
    Class objectClass1 = [object1 class];
    Class objectClass2 = [object2 class];
    Class objectClass3 = [NSObject class];
    
    // runtime
    Class objectClass4 = object_getClass(object1);
    Class objectClass5 = object_getClass(object2);
    
    //验证类对象是唯一的。存储的地址都是唯一的
    NSLog(@"%p %p %p %p %p", objectClass1, objectClass2, objectClass3, objectClass4, objectClass5);
    
    

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

    1. isa指针
    2. superclass指针
    3. 类的属性信息(@property),类的成员变量信息(ivar)
    4. 类的对象方法信息(instance method),类的协议信息(protocol)
    5. ……

    meta-class

    元类对象获取方式:

    //runtime中传入 类对象 此时得到的就是元类对象
    Class objectMetaClass = object_getClass([NSObject class]);
    class_isMetaClass(objectMetaClass) // 判断该对象是否为元类对象
    
    

    特性:每个类在内存中有且只有一个meta-class对象
    作用:存放了类方法。而class存放 类的对象方法

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

    1. isa指针
    2. superclass指针
    3. 类的类方法的信息(class method)
    4. ……

    除了类方法,meta-class对象和class对象的内存结构是一样的

    isa 指针

    在调用方法时,isa的作用:

    • 找到class类,最后找到对象方法

    • 找到meta-class元类,最后找到类方法

    1. instance的isa指向class,当调用对象方法时,通过instance的isa找到class,最后找到对象方法的实现进行调用。
    2. class的isa指向meta-class
      当调用类方法时,通过class的isa找到meta-class,最后找到类方法的实现进行调用

    相关文章

      网友评论

          本文标题:Objective-C对象的分类与isa指针

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