OC底层-OC对象的本质
OC对象的本质
1.1、NSobject 对象底层实际是有一个isa指针的NSObject_IMPL结构体;
1.2、一个object对象会分配的到多少内存?
大小16个字节 ,可以用malloc_size输出查看大小;实际成员isa占用是8(64bit环境下),但是coreFoundtion框架内部规定小于16就分配16; (其实ios操作系统分配内存都是16的倍数,其实对象实际占不了那么大的内存) int 4个 bool 1个
class_getInstanceSize([person class]):得到的是对象实际只需要多少内存,遵循结构体的内存对齐;
malloc_size((__bridge const void *)(ps)) : 得到的是实际maclloc分配到的内存大小;
内存对齐: 结构体的内存大小 为增大成员内存大小的倍数。
2.1、oc中的对象 分为那三种 ?
- INStance对象(实例对象):存放isa指针、成员变量
- Class对象(类对象):存放isa、superclass指针、类的属性信息、实列方法信息、类的协议信息、类的成员变量信息
类对象的获取 : class class1 = [NSOject class] 或者object_getClass(实例对象)
注意:[[NSOject class] class] 还是返回 类对象;
- meta-class对象(元类对象) meta-data 元数据 :isa、superclass指针、主要存放类方法信息
元类对象的获取 :class metaClass = object_getClass(类对象)
2.2、对象的isa指针指向哪里?
方法调用的实质是:运用runtime的方法 objc_msgSend(对象,@selector(方法名))向 对象发送消息;调用实例对象方法是向实列对象发送消息,类方法是向类对象发送消息;但是实例方法存放在类对象中,类方法存放在元类对象中;
在和这环节中isa指针就体现了它的作用了;
instance对象的ias指向class对象;
class的isa指向meta_class;
meta_class的isa指向基类的meta_class对象
2.3、class对象的superclass有什么用?
class对象的superclass指向super的class对象;
当子类要调用父类的对象方法,会先通过自身的isa指针找到class对象,然后通过class对象的superCalss指针找到父类的Class对象,最后找到父类的对象方法进行调用。
2.4、meta-class对象的superclass有什么用?
2.5、 Instance对象、class对象、 meta_class对象的isa、superclass指针关系图
- instance的isa指向class
- class的isa指向meta_class
- Meta-class的isa指针指向基类的Meta-class;基类的Meta-class 的isa指针指向自己
- class的superclass指向父类的class;如果没有父类(就是基类了),superClass指向nil
- meta-class的superClass指向父类的meta-class;基类的meta-class指向基类的class
2.3、oc的类信息存放在哪里?
成员变量的具体值,存放在instance对象中
对象方法、属性、成员变量、协议相关的信息,存放在class对象中
类方法存放在meta_class对象中
(这里为什么成员变量的值存放在instance对象中,而信息放在class对象中;是因为值可以多分 ,不同实例对象有不同的属性值,而属性信息只需要一份存放在class对象中就可以了)
2.4 、 oc里面的方法前面默认2个参数为:调用者 和 当前方法名 _cmd