OC对象的本质

206 阅读2分钟

OC对象的本质

oc对象的本质是C语言中的结构体,结构中有一个成员变量Class isa

Struct NSObject_IMPL {
    Class isa; //在64位中占8个字节,在32位中占4个字节
}

//指针即为地址,指针几个字节跟语言无关,而是跟系统的寻址能力有关,譬如以前是16为地址,指针即为2个字节,现在一般是32位系统,所以是4个字节,以后64位,则就为8个字节。


NSObject *obj = [[NSObject alloc] init];
//获得NSObject实例对象的成员变量所占用的大小--8
size_t size = class_getInstanceSize([NSObject class]);
NSLog(@"size = %zd",size); //8
//获取obj指针所指向的内存大小--16
NSLog(@"size = %zd",malloc_size(CFBridgingRetain(obj))); //16

//也就是说创建对象的时候分配了16个字节大小的内存空间,但实际只用了8个字节大小。
  • 创建一个对象至少需要多少内存,结构体会内存对齐,返回最大成员变量的整数倍
class_getInstanceSize
  • 创建一个对象系统分配了多少内存,系统会内存对齐为16的倍数 16、32、48、64、80、96、112、128
malloc_size
  • sizeof()仅仅是返回参数所占内存大小,跟传入指针所指向的内存空间无关,如果传入的是指针占8个字节
sizeof()

OC对象的分类

OC对象分为实例对象、类对象、元类对象。

  1. 实例对象
  • 实例对象在内存中存储的信息包括isa指针(isa指针本身也是一个成员变量)。
  • 以及其他成员变量的值。
  1. 类对象
  • 类对象在内存中存储的信息包括isa指针
  • superclass指针
  • 类的属性信息(@property)
  • 类的对象方法信息(instance method)
  • 类的协议信息(protocol)
  • 类的成员变量信息(ivar),存储的是成员变量的类型、名字具体的值是由实例对象持有。
  1. 元类对象(meta-class)
 //传入实例对象获取的是类对象,传入类对象获取的是元类对象
 object_getClass(<#id  _Nullable obj#>)
 
 //这个函数是根据传入的类名字符串获取相应的**类对象**
 object_getClass(<#id  _Nullable obj#>)
  • 每个类在内存中有且仅有一个元类对象

  • meta-class对象和类对象的结构是一样的,但是用途不一样,在内存中存储的信息主要包括

  • isa指针

  • superclass指针

  • 类的类方法信息(class method)