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] 的地址值