OC对象的本质

对象的本质

OC对象的本质是结构体,结构体内部是一个指针;
结构体.png

1、引申:一个OC对象最少占用几个字节?

  • 一个指针占用8个字节,但是Foundation 框架硬性规定:分配内存时,一个对象最少会分配16个字节;
  • 函数:malloc_size ()(allocwithZone—createInstanceFromZone— cls->instanceSize。 一旦发现分配内存小于16,就把它变成16.)
  • 遵循内存对其原则,分配的内存都为16的倍数。
对象:

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

1、实例对象:

  • isa指针;
  • 成员变量具体的值;

2、类对象:

  • isa指针;
  • superclass 指针;
  • 对象方法;
  • 协议;
  • 属性;
  • 成员变量;

3、元类对象:

  • isa指针;
  • superclass 指针;
  • 类方法;
isa与superclass

1、实例对象的isa指向类对象;类对象的isa指向元类对象;

  • 当调用实例方法时:实例对象通过isa找到类对象,调用类对象里的实例方法;
  • 调用类方法时同理。

2、类对象的superclass指向父类;

  • 当调用父类的实例方法时:实例对象通过isa找到类对象;类对象通过superclass找到父类,进而找到父类里的实例对象方法;
  • 调用父类的类方法同理。

类对象的结构
  • class、meta-class对象的本质结构都是struct objc_class
  • 源码

  • class_rw_t里面的methods、properties、protocols是二维数组,是可读可写的,包含了类的初始内容、分类的内容;
  • class_ro_t里面的baseMethodList、baseProtocols、ivars、baseProperties是一维数组,是只读的,包含了类的初始内容;

你可能感兴趣的:(iOS,ios)