- runloop运行循环
- 1;是个死循环,主线程默认开启,子线程不开启
- 2;保证程序不退出
- 3;监听事件,应用场景
- 1;定时器,时钟,NSTimer,CADisplayLink
- 2;监听网络端口数据的接收和发送情况,socket开发
- iOS 中所有的事件监听全部由运行循环负责
- 主线程的 RunLoop 在应用启动的时候就会自动创建
- 其他线程则需要在该线程下自己启动
- 不能自己创建 RunLoop
- RunLoop 并不是线程安全的,所以需要避免在其他线程上调用当前线程的 RunLoop
- RunLoop 负责管理 autorelease pools
- RunLoop 负责处理消息事件,即输入源事件、计时器事件和网络请求事情
- runtime运行时
- 是OC面向对象编程语言的运行环境,类似java的虚拟机
- runtime是OC的底层实现,OC代码最终转换为runtime的C语言库的东西
- 比如类转换为runtime中的结构体等数据结构
- 方法转换为C语言中的函数,调用方法都是转成了objc_msgSend() 函数,是消息机制
- 导入头文件<objc/message.h><objc/runtime.h>
- runtime可以做的事情:
- 获取类中的成员变量
- 为类动态的增加成员变量
- 动态改变类的方法实现
- 为类动态的增加新的方法
- 运行时的运用场景:
- 1;分类category,动态获取类的属性数组为类动态添加属性
- 分类中导入objc,class_copyIvar-method-propertyList-protocol,运行时方法获得类属性列表
- 在分类中写的类方法,+(NSArray *)cz_objProperties{}获得类的属性数组
- 1;建立分类方法,类方法
- 2;class_copyPropertyList获取类属性数组
- 3;遍历数组,
- 4,property_getName获得数组名字
- 5;转为OC的字符串NSStringWithCString:加入到数组
- 6;free(proList)注意释放,retain/creat/copy
- 2;字典转模型,动态获取类的属性数组,通过KVC设置数值
- 分类中的+(instance)cz_objectWithDict{}把外面VC的字典转为模型对象
- 1;获取属性列表
- 2;遍历字典enumerate...,获得key,value,
- 3;判断key是否在属性数组中[ proList containsObject:key]
- 是的话,用KVC赋值,setValue forKey:
- 4;字典转模型,写到了分类方法里,模型里只有属性,简洁
- 把分类拖入,所有的对象都具有了这个方法
- 所有字典转模型框架的写法,会考虑到字典的嵌套
- 分类中的+(instance)cz_objectWithDict{}把外面VC的字典转为模型对象
- 3;给分类,增加关联对象,开发框架时解耦
- 利用关联对象,提高效率 动态添加属性
- 1;objc_getAssociatedObject:调用运行时方法前,判断属性数组是否获取,获取就直接返回
- 2;运行时获取属性数组
- 3;objc_setAssociatedObject:动态创建属性,记录属性数组
- 好处是,不用每次都调用运行时方法,提高效率
- 利用关联对象,提高效率 动态添加属性
- 4;利用运行时交叉方法 method swizzling
- 1;执行自己的方法
- 2;然后执行系统或者第三方框架的方法
- 3;黑魔法,依赖系统/框架的版本,一旦改变就不好了
- AFN交叉了系统的resume,suspend,af_resume
- 1;分类category,动态获取类的属性数组为类动态添加属性
时间: 2024-10-24 21:49:52