一 : 几种情况底层调用
减 号
方法底层
加号
方法底层
二 : 面试题
代码执行效果以及原因.
上述代码结构分析
其代码结构相当于实例对象的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在结构体第二参数父类进行搜索.