iOS底层学习-day-3

前言-OC语法篇

我是一名iOS开发者, iOS底层 菜鸟的进阶之路30天。

问题

对象的isa指针指向哪里?

  • instance对象的isa指向class对象
  • class对象的isa指向meta-class对象
  • meta-class对象的isa指向基类的meta-class对象

OC的类信息存放在哪里?

  • 对象中成员变量的具体值,存放在对象instance
  • 对象方法、属性、成员变量、协议信息,存放在class(类)
  • 类方法,存放在meta-class对象中

OC的三种对象的介绍

窥探struct objc_class的结构

在这里插入图片描述

对象方法类方法
  • 调用对象方法 : 调用到类方法列表中的的对象方法
  • 当调用对象方法时,通过instance的isa找到class,最后找到对象方法的实现进行调用
LZPerson *person = [[LZPerson alloc] init];
person->_age = 10;
//1.一般调用
[person personInstanceMethod];
//2.rutime本质的调用
objc_msgSend(person, @selector(personInstanceMethod));
  • 调用到类中的的类方法 : 调用到元类方法列表中的的类方法
//1.一般调用
[LZPerson personClassMethod];
//2.rutime本质的调用
objc_msgSend([LZPerson class], @selector(personClassMethod))
  • 子类的实例对象调用父类的实例对象方法
//1.一般调用
[student personInstanceMethod];
//2.rutime本质的调用
objc_msgSend([LZStudent class], @selector(personInstanceMethod))
  • student的实例对象找到student的类对象中的对象方法,如果没找到,studnet的类对象的superclass再直接指向person的类对象,就找到了
    在这里插入图片描述

isa和superclass总结

  • isa
    • instance的isa指向class
    • class的isa指向meta-class
    • meta-class的isa指向基类的meta-class //不管是什么元类的isa都指向基类的元类,也就是NSObject的元类
  • superclass
    • class的superclass指向父类的class
    • 如果没有父类,superclass指针为nil,所以NSObject的类对象指向nil
  • meta-class
    • meta-class的superclass指向父类的meta-class
    • 基类的meta-class的superclass指向基类的class为什么?

ISA_MASK

  • 从64bit开始,isa需要进行一次位运算(& ISA_MASK),才能计算出真实地址
  • p/x (long)person->isa
  • 如果person 和 [Person class] 的 isa地址不一样因为需要
  • person->isa & ISA_MASK才是 [Person class] 的地址值
发布了12 篇原创文章 · 获赞 0 · 访问量 119

猜你喜欢

转载自blog.csdn.net/weixin_41732253/article/details/103714720