十七、OC底层面试解析

2020-10-27  本文已影响0人  KB_MORE

【面试-1】方法的调用顺序

类的方法 和 分类方法 重名,如果调用,是什么情况?

image

【面试-2】Runtime是什么?

1、category 类别、分类

2、extension 类扩展

【面试-3】方法的本质,sel是什么?IMP是什么?两者之间的关系又是什么?

【面试-4】能否向编译后得到的类中增加实例变量?能否向运行时创建的类中添加实例变量

【原因】:编译好的实例变量存储的位置是ro,一旦编译完成,内存结构就完全确定了

【经典面试-5】 [self class]和[super class]的区别以及原理分析

代码调试

图片.png

进入[self class]中的class源码

- (Class)class {
    return object_getClass(self);
}

👇
Class object_getClass(id obj)
{
    if (obj) return obj->getIsa();
    else return Nil;
}

其底层是获取对象的isa,当前的对象是LGTeacher,其isa是同名的LGTeacher,所以[self class]打印的是LGTeacher

[super class]中,其中super 是语法的 关键字,可以通过clangsuper的本质,这是编译时的底层源码,其中第一个参数是消息接收者,是一个__rw_objc_super结构

image
ENTRY _objc_msgSendSuper2
UNWIND _objc_msgSendSuper2, NoFrame

ldp p0, p16, [x0]       // p0 = real receiver, p16 = class 取出receiver 和 class
ldr p16, [x16, #SUPERCLASS] // p16 = class->superclass
CacheLookup NORMAL, _objc_msgSendSuper2//cache中查找--快速查找

END_ENTRY _objc_msgSendSuper2

完整回答

所以,最完整的回答如下

[self class]方法调用的本质是 发送消息,调用class的消息流程,拿到元类的类型,在这里是因为类已经加载到内存,所以在读取时是一个字符串类型,这个字符串类型是在map_imagesreadClass时已经加入表中,所以打印为LGTeacher
[class class]打印的是LGTeacher,原因是当前的super是一个关键字,在这里只调用objc_msgSendSuper2,其实他的消息接收者和[self class]是一模一样的,所以返回的是LGTeacher

上一篇下一篇

猜你喜欢

热点阅读