OC-对象

177 阅读1分钟

NSObject占用多少内存

NSObject底层接口是
struct  NSObject_IMPL{
   Class isa
}
1:一个指针占用8个字节,struct存在内存对齐所分配的内存是占用最大字节的倍数,所以系统会至少分配16个字节
2:成员只占用8个字节
3:获取内存的 malloc_size()(实际分配内存)/object_getInstanceSize()(成员占用内存)

Class底层结构

struct objc_class *Class
struct objc_class : objc_object{
    //Class isa
    Class superClass;
    cache_t cache;
    class_data_bits_t bits; 
    class_rw_t *data() const {
        return bits.data();
    }
    
}
struct class_data_bits_t {
    public:
    class_rw_t* data() const {
     ///#define FAST_DATA_MASK          0x00007ffffffffff8UL
        return (class_rw_t *)(bits & FAST_DATA_MASK);
    }
}
struct class_rw_t {
    // Be warned that Symbolication knows the layout of this structure.
    uint32_t flags;
    uint16_t version;
    uint16_t witness;

    const class_ro_t *ro;

    method_array_t methods; ///方法列表
    property_array_t properties;///属性列表
    protocol_array_t protocols;///协议列表

  
};
struct class_ro_t {
    uint32_t flags;
    uint32_t instanceStart;
    uint32_t instanceSize; ///占用内存大小
#ifdef __LP64__
    uint32_t reserved;
#endif

    const uint8_t * ivarLayout;
    
    const char * name;
    method_list_t * baseMethodList;
    protocol_list_t * baseProtocols;
    const ivar_list_t * ivars; ///属性信息

};

cache_t 缓存方法,实现是一个散列表

结构
struct cache_t{
    struct bucket_t *buckets();///散列表
    mask_t mask();///数组长度减1
    mask_t occupied();///存储了多少个值
    
}
 struct bucket_t{
    SEL sel;
    IMP imp;
 }