类的结构分析

2020-09-14  本文已影响0人  CrazySnow

什么是元类

isa走位
对象的isa—>类(也叫类对象
类的isa—>元类
元类的isa—>NSObject(根元类)
NSObject的isa —>NSObject(他自己)

*内存中有且仅有一个NSObject,根元类的元类指向他自己

isa走位.png

objc_class & objc_object

对象和类都有isa,其中有什么联系

struct NSObject_IMPL {
    Class isa;
};

typedef struct objc_class *Class;

objc_class的定义:

struct objc_class : objc_object {//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

    class_rw_t *data() const {
        return bits.data();
    }
    void setData(class_rw_t *newData) {
        bits.setData(newData);
    }

    void setInfo(uint32_t set) {
        ASSERT(isFuture()  ||  isRealized());
        data()->setFlags(set);
    }

    void clearInfo(uint32_t clear) {
        ASSERT(isFuture()  ||  isRealized());
        data()->clearFlags(clear);
    }

    // set and clear must not overlap
    void changeInfo(uint32_t set, uint32_t clear) {
        ASSERT(isFuture()  ||  isRealized());
        ASSERT((set & clear) == 0);
        data()->changeFlags(set, clear);
    }

objc_classobjc_object的关系:

面试题:
objc_object对象的关系

【总结】 objc_object对象的关系是继承关系

内存

//对象
    CJLPerson *p1 = [CJLPerson alloc]; // p1 是指针
    CJLPerson *p2 = [CJLPerson alloc];
    NSLog(@"%d -- %p", p1, &p1);
    NSLog(@"%d -- %p", p2, &p2);
上一篇 下一篇

猜你喜欢

热点阅读