12-Runtime-04(super、class、superc
2019-03-11 本文已影响0人
weyan

一、super
super:决定是从父类开始查找方法。

二、class
调用class返回的类型是由消息的接收者决定的。

三、superclass

--------------------------------------------------面试题----------------------------------------------------------
1、class面试题
- 1、isMemberOfClass:(Class )cls
对象方法:
判断方法调用者的类对象是否是class类对象
类方法:
判断类对象的元类对象是否是cls类对象 - 2、isKindOfClass:(Class)cls
对象方法:
1、判断类对象是否等于当前类的类对象。
2、判断类对象是否等于父类的类对象。
3、继续一层一层的去找父类判断。
类方法:
1、判断类对象的元类对象是否等于当前类对象的元类对象。
2、判断类对象的元类对象是否等于父类的元类对象。
3、继续一层一层的去找父类的元类对象。



2、super面试题




疑惑1、print为什么能调用成功?

obj就相当于person;cls相当于isa;所以print方法能调用成功。
疑惑2、为什么self.name变成了ViewController?或者其他

-
第一种情况:打印的是不是控制器

test/cls/obj这三个地址是挨着的,在栈中从高地址到低地址,取出_name时,跳过isa的8个字节空间,找到test这8个字节空间。
上面的等价于下面的:


-
第二种情况:打印的是控制器ViewController

-
验证objc_msgSendSuper2中的第一个参数objc_super结构体中的当前类的类对象
