面试题收集

2020-12-06  本文已影响0人  路在脚下了

一个Objective-C对象如何进行内存布局

iOS 内存调试技巧

iOS 原理探索-读写锁

OC [objc message]发送消息的过程

(1) 首先根据obj的isa指针进入它的类对象cls里面。
(2) 在obj的cls里面,首先到缓存cache_t里面查询方法message的函数实现,如果找到,就直接调用该函数。
(3) 如果上一步没有找到对应函数,在对该cls的方法列表进行二分/遍历查找,如果找到了对应函数,首先会将该方法缓存到obj的类对象cls的cache_t里面,然后对函数进行调用。
(4) 在每次进行缓存操作之前,首先需要检查缓存容量,如果缓存内的方法数量超过规定的临界值(设定容量的3/4),需要先对缓存进行2倍扩容,原先缓存过的方法全部丢弃,然后将当前方法存入扩容后的新缓存内
(5) 如果在obj的cls对象里面,发现缓存和方法列表都找不到mssage方法,则通过cls的superclass指针进入它的父类对象f_cls里面
(6) 进入f_cls后,首先在它的cache_t里面查找mssage,如果找到了该方法,那么会首先将方法缓存到消息发送者cls的cache_t里面,然后调用方法对应的函数。
(7) 如果上一步没有找到方法,将会重复f_cls的superclass查找流程。直到superclass为nil,如果还没找到,将进入消息机制的动态解析阶段。
(8) 发送 +resolveClassMethod or +resolveInstanceMethod.消息。进入同上面的消息发送流程。

initialize的调用规则

  • +initialize方法会在类对象 第一次 接收到消息的时候调用
  • 调用顺序:调用某个类的+initialize之前,会先调用其父类的+initialize(前提是父类的+initialize从来没有被调用过)
  • 由于+initialize的调用,是通过消息机制,也就是objc_msgSend(),因此如果子类的+initialize没有实现,就会去调用父类的+initialize
  • 基于同样的原因,如果分类实现的+initialize,那么就会“覆盖”类对象本身的+initialize方法而被调用。

收到

上一篇 下一篇

猜你喜欢

热点阅读