zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    网页中这 10 种字体的运用方式,不会让人觉得 Low
    如何估算文章阅读时长?
    如何养出一个三十几亿身家的儿子
    2018免费的隐私保护工具
    写一份好的产品说明书
    安装 Ubuntu 19.10 选用 zfs 文件系统
    ESXI常用命令
    Harbor ($docker login) Error saving credentials
    Vue中使用matomo进行访问流量统计的实现
    eslint Cannot read property 'range' of null错误
  • 原文地址:https://www.cnblogs.com/hanfengs/p/5674488.html
Copyright © 2011-2022 走看看