美文网首页runtime.runloop
[iOS]三个问题全面理解runtime

[iOS]三个问题全面理解runtime

作者: 青火 | 来源:发表于2021-03-10 16:45 被阅读0次

问题1.分类方法跟本类同名,调用时,会调用谁,如果调用分类的话,那如何调用本类的同名方法?

参考文章:runtime一目了然分类本类方法编译规则

问题2.runtime 可以用来干什么?

1.动态创建类  用途kvo 动态创建监听类的的派生类 当一个类对象的第一次被观察,那么系统会偷偷

将isa指针指向动态生成的派生类,从而在给被监控属性赋值时执行的是派生类的setter方法,willchangevalue,didchangevalue

参考文章:kvo原理s

2.动态添加属性 ,比如按钮添加防重复点击 时间间隔属性  之类的

3.动态添加方法,场景:如果一个类方法非常多,加载类到内存的时候也比较耗费资源,需要给每个方法生成映射表,可以使用动态给某个类,添加方法解决。

4.hook 交换方法 打点统计 等等用途 。

5.遍历属性 字典解析 模型化,实现nscoding协议  写法方便

面试题3.消息转发机制?

消息转发机制表面上理解是寻找对象接受者,但本质是寻找sel的imp 

我们在调用函数内部其实就是在发消息,objc_sendMsg 这个函数需要的是target 和sel,但是要想发成功得根据sel找的函数的Imp 才能发,如果没找到则会抛出异常 不识别的方法notRecoginzerSelector ...

所以转发机制根据你是否知道那个类 有此sel的imp

1.没有那个类有此Imp,你只能动态添加一个Imp

则需要用动态决议 也就是 +(BOOL) resolve Instance/Class Method 函数

此函数允许你调用了objc_msgSend之后 提供一个imp

重写此函数 并且 实现一个imp  在此函数返回之前 用class_addMethod 临时给这个对象加一个imp

2.你知道有某个类可以提供此Imp,其中系统有两种方法让你提供这个类对象

2.1. -(id)forwardingTargetForSeletor; 返回这个对象即可

2.2 .完整的一套转发机制

-(NSMethodSignature*)methodSignatureForSelector:(SEL)aSelector 先得到一个方法的signature

-(void)forwardInvocation:(NSInvocation*)anInvocation 实现此函数 判断anInvocation.selector是否是你调用的方法 若是  用[anInvocation invokeWithTarget:这个对象即可] 

参考文章:实例结构、类结构、元类是什么、知道了这些你就懂了消息转发机制

相关文章

网友评论

    本文标题:[iOS]三个问题全面理解runtime

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