iOS开发中Runtime的实际应用

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章