对象的本质
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是一维数组,是只读的,包含了类的初始内容;
网友评论