IOS基础知识-OC对象原理篇

一个NSObject对象占用多少内存?

NSObject对象转化为c语言,实际上就是一个结构体;里面只有一个成员isa指针,而指针在64位架构中占8个字节。也就是说一个NSObjec对象所占用的内存是8个字节(32位4个字节)。

内存对齐为两个原则:
原则 1. 前面的地址必须是后面的地址正数倍,不是就补齐。
原则 2. 整个Struct的地址必须是最大字节的整数倍。

OC的类信息存放在哪里

OC对象主要可以分为三种
instance对象(实例对象)
class对象(类对象)
meta-class对象(元类对象)
instance对象就是通过类alloc出来的对象,每次调用alloc都会产生新的instance对象

class对象在内存中存储的信息主要包括
isa指针
superclass指针
类的属性信息(@property),类的成员变量信息(ivar)
类的对象方法信息(instance method),类的协议信息(protocol)

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

isa指针
superclass指针
类的类方法的信息(class method)

对象的isa指针指向哪里

当对象调用实例方法的时候,我们上面讲到,实例方法信息是存储在class类对象中的,那么要想找到实例方法,就必须找到class类对象,那么此时isa的作用就来了。

[stu studentMethod];

instance的isa指向class,当调用对象方法时,通过instance的isa找到class,最后找到对象方法的实现进行调用。

当类对象调用类方法的时候,同上,类方法是存储在meta-class元类对象中的。那么要找到类方法,就需要找到meta-class元类对象,而class类对象的isa指针就指向元类对象

[Student studentClassMethod];

class的isa指向meta-class
当调用类方法时,通过class的isa找到meta-class,最后找到类方法的实现进行调用


1434508-e71cf3850379fe21.png

当对象调用其父类对象方法的时候,又是怎么找到父类对象方法的呢?,此时就需要使用到class类对象superclass指针。

[stu personMethod];
[stu init];

当Student的instance对象要调用Person的对象方法时,会先通过isa找到Student的class,然后通过superclass找到Person的class,最后找到对象方法的实现进行调用,同样如果Person发现自己没有响应的对象方法,又会通过Person的superclass指针找到NSObject的class对象,去寻找响应的方法


1434508-c424291af118ebad.png

当类对象调用父类的类方法时,就需要先通过isa指针找到meta-class,然后通过superclass去寻找响应的方法

[Student personClassMethod];
[Student load];

当Student的class要调用Person的类方法时,会先通过isa找到Student的meta-class,然后通过superclass找到Person的meta-class,最后找到类方法的实现进行调用

对isa、superclass总结

instance的isa指向class
class的isa指向meta-class
meta-class的isa指向基类的meta-class,基类的isa指向自己
class的superclass指向父类的class,如果没有父类,superclass指针为nil
meta-class的superclass指向父类的meta-class,基类的meta-class的superclass指向基类的class
instance调用对象方法的轨迹,isa找到class,方法不存在,就通过superclass找父类
class调用类方法的轨迹,isa找meta-class,方法不存在,就通过superclass找父类


1434508-49ba7d6446b3ded2.png

总结:

一个NSObject对象占用多少内存?
答:一个指针变量所占用的大小(64bit占8个字节,32bit占4个字节)
对象的isa指针指向哪里?
答:instance对象的isa指针指向class对象,class对象的isa指针指向meta-class对象,meta-class对象的isa指针指向基类的meta-class对象,基类自己的isa指针也指向自己。
OC的类信息存放在哪里?
答:成员变量的具体值存放在instance对象。对象方法,协议,属性,成员变量信息存放在class对象。类方法信息存放在meta-class对象。

你可能感兴趣的:(IOS基础知识-OC对象原理篇)