Runtime是一套C语言的库,主要是为了给OC提供动态特性支持,所有的函数调用都会被转换为C语言的msgsend。
OC动态特性
动态特征指在编译器不会做决定,而是在运行期才会去做决定。
动态编译
OC不会对对象方法的调用在编译器决定要具体执行哪个方法,甚至是只是在接口文件定义,没有在实现文件中实现定义的方法都可以编译通过,方法的相应链在运行期才会去做对应的检查,首先会从分类中查看方法是否实现,然后会从本类中查找,再去从父类中查找,一直到NSObject,如果都没有实现会崩溃。找到了则才会去做选择。
这样的特性有什么好处呢?
1、可以在运行期动态的创建一个类
objc_allocateClassPair
2、可以在运行期动态的为类去增加方法
class_addMethod
3、可以在运行期动态的为类增加属性
class_addIvar
4、可以为在运行期动态的为类去增加属性
设置关联对象:objc_setAssociatedObject
获取关联对象:objc_getAssociatedObject
动态类型
在编译期间不会去检查对象的严格类型,只要不把对象类型指向基本数据类型,将基本数据类型指向对象类型即可,在编译期间不会去检查对象的严格类型,只要不把对象类型指向基本数据类型,将基本数据类型指向对象类型即可
动态加载
iOS中Asset中根据手机频幕分辨率的大小,动态的去加载如@1x @2x @3x的图片
应用场景
万能跳转
通过后台下发的页面地址,跳转到任意存在的controller,无需引入需要跳转controller的头文件
YYModel字典转模型
组件化路由
协议://模块名称/方法名称/参数名称
通过NSClassFromString获取模块的类
通过NSSelectorFromString获取模块的方法
通过[模块名称 performSelector:方法名称 withObject:参数名称]进行组件的通信
MJrefresh替换头部刷新控件样式
继承MJRefreshGifHeader配置动画
替换headerWithRefreshingBlock方法通过method_changeimplementation函数