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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值