1.Sel与Imp的关系
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