oc对象的本质

struct NSObject_IMPL {
    Class isa;   //  8个字节
}

一个NSObject对象占用多少内存?
系统分配16个字节给NSObject对象(通过malloc_size获得)
但NSObject对象内部只使用了8个字节的空间 (64bit环境下,通过 class_getInstanceSize函数获得)

   //创建一个实例对象,至少需要多少内存,结构体内存对齐后的
    #import 
    class_getInstanceSize([NSObject class])
  
  //创建一个实例对象,实际分配多少内存 iOS操作系统给对象的内存地址是16的倍数
    #import 
    malloc_size(const void *ptr)

大端 小端(高地址->低地址)
struct的内存对齐
isa是objc_class 结构体的指针(struct objc_class *class)
ios操作系统给对象的内存地址是16的倍数 16 32 48 ...
子类继承父类内存的分配
属性对应的方法不放在实例对象内存内

sizeof() 是运算符,编译时会转化成常量,传指针变量时,返回的是指针变量的字节长度

一个类的类对象在内存中是唯一的,元类对象也是唯一的

instance对象在内存中存储的信息主要包括
  a) isa指针
  b) 其他成员变量
Class对象在内存中存储的信息主要包括
   a) isa指针
   b) superclass指针
   c) 类的属性信息(@property),
   d) 类的对象方法信息(instance method)
   e) 类的协议信息(protocol),
   f) 类的成员变量信息(ivar,不含值,值放在实例对象内存)
meta-class元类对象, 将类对象当做参数传入,获得元类对象
  Class objectMetaClass = object_getClass([NSObject class]);
  每个类只有一个元类对象
  meta-class对象和class对象的内存结构是一样的(都是Class),但是用途不一样,在内存中存储的主要信息包括
    a) isa指针
    b) superclass指针
    c) 类的类方法信息(class method)
  1. Class object_getClass(const char *aClassName)
    1> 传入字符串类名
    2> 返回对应的类对象
  1. Class object_getClass(id )
    1> 传入的obj可能是instance对象, class对象,meta-class对象
    2> 返回值
    a) 如果是instance对象,返回class对象
    b) 如果是class对象,obj返回meta-class对象
    c) 如果是meta-class对象,返回NSObject(基类)的meta-class对象
  1. *(Class)class 、 - (Class)class
    1> 返回的就是类对象

你可能感兴趣的:(oc对象的本质)