问题1.分类方法跟本类同名,调用时,会调用谁,如果调用分类的话,那如何调用本类的同名方法?
问题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:这个对象即可]