Runtime简介
Runtime是Objective-C的一个固有特性,及在编译阶段并不能确定真正调用的函数名,函数的调用在运行时才得到确认。所以我们可以看到,OC在编译阶段没有报错的情况下,会在运行过程中出现闪退和崩溃的错误,而C语言在编译过程中就会报错。
消息转发
执行对象相对的缓存方法 ->
执行执行对象方法列表的方法 ->
执行父类指针指向的方法 ->
执行拦截调用的方法 ->
消息机制 - objc_msgSend(obj,@selector(函数名)) 函数相关的消息转发机制
发送消息- 方法的调用就是对象发送消息 [p eatApple]; => objc_msgSend(p, @selector(eatApple));
iOS的错误处理 - 编译未出报错,运行却闪退
动态调用特性(C语言-函数在编译时就会决定调用哪个函数),运行时才确定需要调用的函数
Runtime术语
SEL
id
Class
通过runtime获取类的相关属性名字
- 获取类的属性列表:property_getName
- 获取类的方法列表:class_copyMethodList
- 获取成员变量列表:class_copyIvarList
- 获取协议列表:class_copyProtocolList
动态调用
@selector 属于runtime中的动态添加方法
关联对象
关联对象:为系统的类添加属性(非继承)
//首先定义一个全局变量,用它的地址作为关联对象的key
static char associatedObjectKey;
//设置关联对象
objc_setAssociatedObject(target, &associatedObjectKey, @"添加的字符串属性", OBJC_ASSOCIATION_RETAIN_NONATOMIC); //获取关联对象
NSString *string = objc_getAssociatedObject(target, &associatedObjectKey);
NSLog(@"AssociatedObject = %@", string);
方法交换
method_exchangeImplementations