需要了解OC对象及方法,参考文章
https://www.jianshu.com/p/568ba8ea6960
Runtime是什么
1.是由C,C++,汇编一起写成的一套API,为OC提供了运行时
2.OC的底层就是Runtime,OC对象本质是结构体,OC方法本质是发送消息,底层都是用的Runtime
Runtime的作用
它是动态运行时系统
OC是的底层是C语言,C是面向过程的
但OC是面向对象的,并且是种动态语言(需要编译器+动态运行时系统)
Runtime就是那个动态运行时系统,它可以动态的创建类和对象,还提供了消息传递和转发机制
编译时顺序: OC -Runtime转化 - C语言 - 汇编语言 - 机器语言 - 可执行文件
实现多继承
OC本身没有多继承,但若要实现一个类继承多个类的效果,可以利用Runtime的消息转发机制,在forwardingTargetForSelector中将消息转发给正确的类对象就可以模拟多继承的效果
动态方法解析
@dynamic
当我们把属性标识为@dynamic时,代表着不需要编译器在编译时为我们生成这个属性的get方法和set方法的具体实现,而是在运行时当我们具体的调用了get和set方法时,再去为它添加具体实现,只有动态运行时语言支持这种功能
Method-Swizzling黑魔法
1.所有页面加入统计
2.拦截系统自带的方法调用
3交换两个方法的实现,可以交换系统方法
Method m1 = class_getInstanceMethod([M1 class], @selector(hello1));
Method m2 = class_getInstanceMethod([M2 class], @selector(hello2));
method_exchangeImplementations(m2, m1);
NSCoding的自动归档和自动解档
Runtime 可以获取某一个类的全部属性的名字
将json转为model
Runtime 可以获取属性的类型
动态添加类和方法
objc_allocateClassPair和objc_registerClassPair
用关联对象为分类添加属性
objc_setAssociatedObject / objc_getAssociatedObject
如何使用 - OC程序有三种途径和运行时系统交互
- 通过Runtime的API
OC的原生底层就是Runtime
* 1. objc_xxx系列函数,关注于宏观使用,如类与协议的空间分配,注册,注销等操作
注意: 分配空间,创建类,仅在创建之后,注册之前,能够添加成员变量
obj_msgSend 发送objc消息
objc_getClass 获取class对象
objc_allocateClassPair和objc_registerClassPair 添加新类
objc_registerClassPair 注册类
objc_setAssociatedObject / objc_getAssociatedObject 用关联对象为分类添加属性
* 2. class_xxx系列函数,关注于类的内部,如实例变量,属性,方法,协议等相关问题
class_addIvar 添加成员变量,成员变量的添加必须在类注册之前.类注册后就可以创建该类的对象了,而再添加成员变量就会破坏创建的对象的内存结构
class_addMethod 给类添加方法
class_getInstanceMethod获取类方法
- 通过编译器提供的OC的上层方法
@selector方法,取类方法的编号,取出的结果是SEL类型
- 通过Foundation框架中的NSObject的方法
以下的方法都是在运行时会编译成响应的方法
isKindOfClass 用于类的实例对象,判断该对象的类是某类或者其子类
isMemberOfClass 用于类的实例对象,判断该对象的类是某类
isSubclassOfClass 用于类对象,判断该类是某类或者其子类
conformsToProtocol
respondsToSelector
instancesRespondToSelector
conformsToProtocol
methodForSelector
instanceMethodForSelector
doesNotRecognizeSelector
performSelector其中一个应用场景 : 一个类在编译时没有某个方法,在运行时才产生了这个方法,就需要调用performSelector来调用这个方法
内部实现原理
汇编有点懵,没看懂
网友评论