一 : 几种情况底层调用

减 号 方法底层

加号 方法底层

二 : 面试题
代码执行效果以及原因.



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

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

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

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

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

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