美文网首页iOS面试题+基础知识
iOS OC instance、class和meta-clas

iOS OC instance、class和meta-clas

作者: yulekwok | 来源:发表于2019-06-21 15:45 被阅读0次

    object_getClass 和 [obj class]的区别

    object_getClass(obj)返回的是obj中的isa指针
    [obj class]则分两种情况:

    1. 当obj为实例对象时,[obj class]中class是实例方法:- (Class)class,返回的obj对象中的isa指针;
    2. 当obj为类对象(包括元类和根类以及根元类)时,调用的是类方法:+ (Class)class,返回的结果为其本身。

    这是iOS OC中的三种类

    1. instance 实例对象
    2. class 对象 类对象
    3. meta-class 元类对象

    instance 实例对象,通过类alloc出来的对象,每次产生的instance对象都是新的 intance 在内存保存的都是属性成员变量和isa,因为所有的类都是继承的nsobject 所以需要都有isa指针

    1. instance(存储信息)

    1. isa 经过 进行位运算 得到的地址是类对象的地址
    class_rw_t* data() {
        return (class_rw_t *)(bits & FAST_DATA_MASK); //需要进行&才能获得最终的地址
    }
    
    1. 其他的成员变量
    struct objc_class : objc_object {
        Class ISA;
        Class superclass;
        cache_t cache;             // formerly cache pointer and vtable
        class_data_bits_t bits;    // class_rw_t * plus custom rr/alloc flags
    

    2. 关于类对象 (存储信息) class

    1. 类对象的isa (指向了元类 meta-class)
    2. superclass 指针
    3. 类的属性信息 (@property)
    4. 类的对象方法 instance method
    5. 类的协议信息 protocol
    6. 类的的成员变量 ivar
    struct class_rw_t {
        // Be warned that Symbolication knows the layout of this structure.
        uint32_t flags;
        uint32_t version;
    
        // 只读的表格
        const class_ro_t *ro;
    
        method_array_t methods; // 方法列表
        property_array_t properties; // 属性列表
        protocol_array_t protocols; // 协议列表
    
        Class firstSubclass;
        Class nextSiblingClass;
    
        char *demangledName;
    }
    

    3. 关于元类对象 (存储信息)meta-class 元类

    每个类在内存中有且只有一个meta-class对象。 meta-class对象和class对象的内存结构是一样的,但是用途不一样,meta-class对象和class对象的内存结构是一样的,所以meta-class中也有类的属性信息,类的对象方法信息等成员变量,但是其中的值可能是空的。

    1. isa 指针 meta-class对象的isa指向基类的meta-class对象
    2. superclass 指针
    3. 类方法

    相关文章

      网友评论

        本文标题:iOS OC instance、class和meta-clas

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