一个NSObject对象占用多少内存?
NSObjcet实际上是只有一个名为isa的指针的结构体,因此占用一个指针变量所占用的内存空间大小,如果64bit占用8个字节,如果32bit占用4个字节
OC的类信息存放在哪里?
一、OC对象及信息的储存
1、instance对象(实例对象):
instance对象可以有多个,并且分别占据着两块不同的内存,instance对象在内存中存储的信息包括:
①、isa指针
②、其他成员变量
2、class对象(类对象)
每一个类在内存中有且只有一个class对象,class对象在内存中储存的信息主要包括:
①、isa指针
②、superclass指针
③、类的属性信息(@property),类的成员变量信息(ivar)
④、类的对象方法信息(instance method),类的协议信息(protocol)
成员变量的值是储存在实例对象中的,因为只有当我们创建实例对象的时候才为成员变量赋值;但是成员变量叫什么名字,是什么类型,只需要一份就可以了。所以储存在class对象中
3、meta-class(元类对象 )
每个类在内存中有且只有一个元类对象;元类对象和类对象的内存结构是一样的,但是用途不一样,在内存中储存的信息主要包括:
①、isa指针
②、superclass指针
③、类的类方法的信息(class method)
meta-class对象和class对象的内存结构是一样的,所以meta-class中也有类的属性信息,类的对象方法信息等成员变量,但是其中的值可能是空的
成员变量的具体值存放在instance对象。对象方法,协议,属性,成员变量信息存放在class对象。类方法信息存放在meta-class对象
对象的isa指针指向哪里?
1、当对象调用实例方法的时候
instance的isa指向class,当调用对象方法时,通过instance对象的isa找到class对象,最后找到对象方法的实现进行调用
2、当类对象调用类方法的时候
类方法是存储在meta-class元类对象中的。那么要找到类方法,就需要找到meta-class元类对象,而class类对象的isa指针就指向元类对象

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

4、当类对象调用父类的类方法时
当Student的class要调用Person的类方法时,会先通过isa找到Student的meta-class,然后通过superclass找到Person的meta-class,最后找到类方法的实现进行调用
instance对象的isa指针指向class对象,class对象的isa指针指向meta-class对象,meta-class对象的isa指针指向基类的meta-class对象,基类自己的isa指针也指向自己。
网友评论