RunTime 动态消息机制
Posted petewell
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了RunTime 动态消息机制相关的知识,希望对你有一定的参考价值。
##什么是RunTime机制
- oc在编译的时是不知道调用哪个函数,运行时找不到就报错
C语言在编译的时候就知道调用哪个方法
[p eat] 消息机制 任何方法调用 本质都是发送消息 [p performSelector:@selector(<#selector#>)] #import <objc/message.h> 倒入运行时框架 运行时发送消息 谁做事情就去调用谁 xcode5以后 不给底层的方法让开发者调用 调用类方法 其实 就是变成一个类对象 本质 类名转换成类对象
- 分类没有父类
重写系统自带的方法 扩展 有一点不好的地方就是 到处导入头文件 很臃肿
(IMP方法的实现)
- 分类没有父类
###利用runtime 交换方法的实现
+(void)load{
Method imageName = class_getClassMethod([UIImage class], @selector(imageNamed:));
method_exchangeImplementations(imageName, ttmIimge);
Method ttmIimge = class_getClassMethod([UIImage class], @selector(ttm_imagenamed:))
}
###动态添加方法
- 性能上的优化 可以用到的时候再加载
当一个方法没有实现 但是又调用了这个方法 就会调用resolveInstanceMethod这个方法
+(BOOL)resolveInstanceMethod:(SEL)sel{
if ([NSStringFromSelector(sel) isEqualToString:@"eat"]) { /** * <#Description#> * * @param cls#> 给那个类 description#> * @param name#> 添加方法的编号 description#> * @param imp#> 方法实现 入口 函数名 description#> * @param types#> 方法类型 description#> * * @return <#return value description#> */ class_addMethod([self class], @selector(resolveThisMethodDynamically), (IMP) myMethodIMP, "v@:"); } } +(BOOL)resolveClassMethod:(SEL)sel{}
###动态添加属性
- 给对象产生一种关联 而不是真的增加代码区别于动态增加方法
给nsobject 增加一个属性
/** 跟对象产生一个关联属性 * * @param object#> 要产生管理的属性 description#> * @param key#> 属性名字 description#> * @param value#> 属性的值 description#> * @param policy#> 策略 就是 strong之类的 description#> * * @return */ objc_setAssociatedObject(<#id object#>, <#const void *key#>, <#id value#>, <#objc_AssociationPolicy policy#>) objc_getAssociatedObject(<#id object#>, <#const void *key#>)
以上是关于RunTime 动态消息机制的主要内容,如果未能解决你的问题,请参考以下文章
iOS面试粮食Runtime—消息传递和转发机制Method Swizzling