runloop和runtime小结


  • 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;字典转模型,写到了分类方法里,模型里只有属性,简洁
            • 把分类拖入,所有的对象都具有了这个方法
            • 所有字典转模型框架的写法,会考虑到字典的嵌套
      • 3;给分类,增加关联对象,开发框架时解耦
        • 利用关联对象,提高效率 动态添加属性  
          • 1;objc_getAssociatedObject:调用运行时方法前,判断属性数组是否获取,获取就直接返回
          • 2;运行时获取属性数组
          • 3;objc_setAssociatedObject:动态创建属性,记录属性数组
          • 好处是,不用每次都调用运行时方法,提高效率
      • 4;利用运行时交叉方法 method swizzling
        • 1;执行自己的方法
        • 2;然后执行系统或者第三方框架的方法
        • 3;黑魔法,依赖系统/框架的版本,一旦改变就不好了
          • AFN交叉了系统的resume,suspend,af_resume
posted @ 2016-07-15 18:15  hanfengs  阅读(269)  评论(0编辑  收藏  举报