1 NSobject本质是什么,占用多少内存
是一个结构体,结构体中包含一个CLass isa指针 isa指针占用8个字节
NSObjec *objc 占用16个字节
用malloc_size 获取指针指向内存空间的大小 为16个字节 ,malloc底层实现 是一个C函数 calloc ,里面处理如果size<16就会分配为16,(所有CFobjec最少占用16个字节 ) 硬性规定,然后ios中分配内粗的大小都是16的倍数
用class_getinstance获取实力对象为8个字节
所以一个对象分配空间为16个字节,但是实际利用起来占用为8个
2 一个自定义对象占多少内存
自定义一个对象
image.png
对象实际
image.png
一个isa指针占用8个字节
Int类型在oc中占用4个字节
所以占用16个字节
3 OC中对象的分类
Objective-C中的对象,简称OC对象,主要可以分为3种
1. instance对象(实例对象)
instance对象就是通过类alloc出来的对象,每次调用alloc都会产生新的instance对象
instance对象在内存中存储的信息包括
isa指针
其他成员变量
2. class对象(类对象)
实例对象中的isa指针指向的就是类对象
每个类在内存中有且只有一个class对象
class对象在内存中存储的信息主要包括
isa指针
superclass指针
类的属性信息(@property)、类的对象方法信息(instance method)
类的协议信息(protocol)、类的成员变量信息(类型描信息)(ivar)
3. meta-class对象(元类对象)
每个类在内存中有且只有一个meta-class对象
meta-class对象和class对象的内存结构是一样的,但是用途不一样,在内存中存储的信息主要包括
isa指针
superclass指针
类的类方法信息(class method)
4 对象的isa指针指向哪里?
instance对象的isa指向class对象
class对象的isa指向meta-class对象
meta-class对象的isa指向基类的meta-class对象
5 phone继承于mobile 在phone中调用[self class]和调用[super class] 打印是什么
打印结果都是phone 在[self class]会通过函数objcMessageSend这个函数调用,消息传递过程中 self为类对象objc_Object
objcet isa指针指向类对象 在类对象catch方法中找对应的函数,找不到就找superclass中的方法,然后一直到基类nsobject中找到方法
[super closs] 会调用objcMessageSendSuper函数,调用者虽然是super 在运行时中表现为objc_super ,
然后super中有一个recever,表示为消息的接受者,其实还是self ,然后查找方法是会直接找objc_objcet的类对象的super class,
也就是跳过当前类对象去向上查找,所以还是phone.
6 mobile中有test([self class])方法,phone中没有,分别用phone和mobile调用test返回是什么
返回mobile
7 类对象objc_class结构
image.png8 OC的类信息存放在哪里?
对象方法、属性、成员变量、协议信息,存放在class对象中
类方法,存放在meta-class对象中
成员变量的具体值,存放在instance对象
网友评论