一丢丢的runtime

173 阅读2分钟

1.Sel与Imp的关系

    1. 对象的本质是什么
    1.1 结构体,里边结构是什么
        1. 子类为什么能找到父类?
        2. 继承关系是怎么走的? 
        3. 消息是如何发送的?
    1.2 调用方法的实质是什么?
        1. 默认参数 id self,SEL _CMD
        2. id self: 消息接收者
        3. SEL _CMD: 方法编号
        4. IMP:函数具体实现的指针
    1.3 怎么从SEL指向IMP?(class_rw_t)
        SEL->IMP___找缓存___缓存Miss___MethodLookUp(找类结构体中的方法列表)
        1 OpenSource-> _objc_msgSend
        2 找方法的函数实现?cacheLookUp,有缓存
    

2.objc_msgSend汇编查找

    1. 快速查找(汇编):速度快,携带信息少
    1. 慢速查找(C|C++):速度慢,信息量大 
        1.Class对象
        2.实例对象
        3.元类对象

3.方法递归查找流程

    1. isa走位图(方法存储路径图)
        1.为什么子类会查找父类?底层是怎么实现的
            1.实例对象的方法列表存放在类对象中
            2.类对象的方法列表存放在元类对象的方法列表中
            3.内存地址为0x00 -> nil
            4.方法查找的流程
                1.自己类的方法列表->log_and_file_cacha
                2.父类的方法列表->log_and_file_cacha
                3.一直找到NSObject
                        
                        

4.动态方法解析

3 方法的缓存机制?NORMOL|GETIMP|LOOKUP
    1:CacheHit
    2:CheckMiss
    3:Add
    4.以上的方法都是进行下边4.1-4.3的流程判断
        1. GETIMP:重新确认是否存在缓存
        2. NORMOL: 有缓存,直接找到缓存过的方法
        3. LOOKUP:重新查找
4 对象(结构体)____MethodLookUp
             1.struct class_rw_t
                 1. method_array_t 
                 2. protrol_array_t
                 3. prorerty_array_t
                 
  • 熟悉了系统流程,可以直接重写系统的方法处理一些Crash
  • 写个NSObject的分类,实现了resolveInstanceMethod()可以在系统的消息转发开始之前,获取到当前类的方法列表,是否包含当前方法,否,则为其class_addMethod(),添加对应的sel防止崩溃,并在传入的函数指针中向系统后台反馈崩溃日志等,冗余操作
1.resolveInstanceMethod
2.forwardingTargetForSelector
3.methodSigntureForSelector
4.forwardInvocation

5.消息转发

6.weak实现原理和销毁原理

散列表 struct sizeTable
    1.spinlock_t 自旋锁
    2.RefCount_Map 引用计数
    3.weak_table_t 弱引用表 
散列表->弱引用表->entry实体->数组->弱引用对象

1.系统的dealloc中的dispose(),
2.在free(oject)前,拿到sizeTable(散列表)
3.在sizeTable(散列表)中 拿到weak_table
4.遍历weak_table拿到entry实体
5.释放entry
po -object
po -self