美文网首页
底层面试

底层面试

作者: ios小喽喽 | 来源:发表于2022-08-24 14:57 被阅读0次

1、load和initialize方法的调用原则和调用顺序?

load方法是在应用程序加载过程中完成调用,在main函数之前调用,load的方法执行顺序大概是 父类>>子类>> Category。 并且如果子类没有实现load方法的话父类的load方法也不会被调用。

initialize方法是在第一次消息发送的时候调用,所以load方法先于initialize调用,会优先调用分类的initalize方法,子类没有实现initialize方法会调用父类的initialize方法

2、runtime是什么?

是由c和C++汇编实现的一套API,为C语言加入面向对象、运行时的功能,是指将数据类型的确定由编译时推迟到运行时

方法中的sel是什么?IMP是什么?两种之间的关系?

sel是方法编号~在read_images期间就编译进入内存

imp是函数指针地址

发送消息会有几个流程:

    a、快速查找(objc_msgSend)~cache_t缓存消息

    b、慢速查找~递归自己|父类~lookUpLmpOrForward

    c、查找不到消息:动态方法解析~resolvelnstanceMethod

    d、消息快速转发~forwardingTargetForSelector

    e、消息慢速转发~methodSignatureForSelector & forwardinvocation

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

不能向编译后得到的类中增加实例变量,只要类没有注册到内存还是可以添加。原因:我们编译好的实例变量存储的位置在ro,一旦编译完成,内存结构就完全确定无法修改

[self class]和[super class]的区别以及原理分析?

[self class]就是发送消息objc_msgSend,消息接收者是self,方法编号是class

[super class]本质就是objc_msgSendSuper,消息的接收者还是self,方法编号:class

只是objc_msgSendSuper更快,跳过了self的查找

Runtime是如何实现weak的,为什么可以自动置nil?

1、通过SideTable找到weak_table

2、weak_table根据referent找到或者创建weak_entry_t

3、然后append_referrer(entry,referrer)将新弱引用的对象加进去entry

4、最后weak_entry_insert 把entry加入到weak_table

图(1)

Runtime Asssociate方法关联对象,需要在dealloc中释放?

1、C++函数释放:object_cxxDestruct

2、移除关联属性:_object_remove_assocations

3、将弱引用自动设置nil:weak_clear_no_lock(&table.weak_table,(id)this);

4、引用计数处理:table.refcnts.erase(this);

5、销毁对象:free(obj)

相关文章

网友评论

      本文标题:底层面试

      本文链接:https://www.haomeiwen.com/subject/xoligrtx.html