OC源码分析-Runtime源码分析(五)

一 : 几种情况底层调用

减 号 方法底层

OC源码分析-Runtime源码分析(五)_第1张图片

加号 方法底层

OC源码分析-Runtime源码分析(五)_第2张图片

二 : 面试题

代码执行效果以及原因.
OC源码分析-Runtime源码分析(五)_第3张图片
OC源码分析-Runtime源码分析(五)_第4张图片
OC源码分析-Runtime源码分析(五)_第5张图片
上述代码结构分析

其代码结构相当于实例对象的isa指针指向类对象 这个结构一样,所以能调用 print方法

OC源码分析-Runtime源码分析(五)_第6张图片
结果分析

其内存结构由低到高地址依次排列,由于在OC中 self.name 是 略过 isa指针8个字节地址,直接访问name地址,所以在面试代码中,也可以理解为,略过obj所指向的cls地址,访问最高地址test

OC源码分析-Runtime源码分析(五)_第7张图片

假如前面没有任何局部变量,只有这三行代码,其实 是super viewDidLoad 影响了 最终的结果,super viewDidLoad底层是 objc_mesSendSuper2其 第一个成员参数是一个结构体.

OC源码分析-Runtime源码分析(五)_第8张图片

内存分析
所以cls移动8个字节 就找到了self ,self 就是viewController对象,所以结果是viewController

OC源码分析-Runtime源码分析(五)_第9张图片

super的真正样子
super 在内存中真正的样子


OC源码分析-Runtime源码分析(五)_第10张图片

实际上会调用objc_msgSendSuper2方法,第一个参数为结构体,两个成员分别为self 和 当前类,objc_msgSendSuper2会自动调用->superclass在结构体第二参数父类进行搜索.

OC源码分析-Runtime源码分析(五)_第11张图片

你可能感兴趣的:(OC源码分析-Runtime源码分析(五))