• RunTime&RunLoop初见


    什么是runtime

    1> runtime是一套底层的c语言API(包括很多强大实用的c语言类型,c语言函数);

    2>实际上,平时我们编写的oc代码,底层都是基于runtime实现的

    也就是说,我们平时编写的oc代码,最终都是转成了底层的runtime代码(c语言代码) ;

    比如说,下面一个创建对象的方法中,

    举例:

    OC :

    [[MJPerson alloc] init]

    runtime :

    objc_msgSend(objc_msgSend(“MJPerson” , “alloc”), “init”)

     runtime有啥用?

    1>能动态生成一个类,一个成员变量,一个方法
    2>能动态修改一个类,一个成员变量,一个方法
    3>能动态删除一个类,一个成员变量,一个方法

    runtime 相关的头文件和函数

    1> 头文件

    利用头文件,我们可以查看到runtime中的各个方法!

    2> 相关应用

    NSCoding(归档和解档, 利用runtime遍历模型对象的所有属性)

    字典 –> 模型 (利用runtime遍历模型对象的所有属性, 根据属性名从字典中取出对应的值, 设置到模型的属性上)

    KVO(利用runtime动态产生一个类)

    用于封装框架(想怎么改就怎么改)

    这就是我们runtime机制的主要运用方向

    3> 相关函数

    objc_msgSend : 给对象发送消息

    class_copyMethodList : 遍历某个类所有的方法

    class_copyIvarList : 遍历某个类所有的成员变量

    class_…..

    这是我们学习runtime必须知道的函数!

    4.必备常识

    1> Ivar : 成员变量

    2> Method : 成员方法

    从上面例子中我们看到我们定义的成员变量,如果要是动态创建方法,可以使用Method

     什么是RunLoop

    RunLoop顾名思义运行循环,可以称它是为了多线程而存在的。

    RunLoop的作用1.保持ios程序的持续稳定。2.处理app的各种事件。3.节省CPU资源,提高程序性能,有事情就做事情,没事情就休息

    特别说明:

      (1)如果没有Runloop,那么程序一启动就会退出,什么事情都做不了。
      (2)如果有了Runloop,那么相当于在内部有一个死循环,能够保证程序的持续运行
      (3)main函数中的Runloop
       a 在UIApplication函数内部就启动了一个Runloop
         该函数返回一个int类型的值
       b 这个默认启动的Runloop是跟主线程相关联的

    RunLoop对象
    (1)在iOS开发中有两套api来访问Runloop a.foundation框架【NSRunloop】 b.core foundation框架【CFRunloopRef】 (2)NSRunLoop和CFRunLoopRef都代表着RunLoop对象,它们是等价的,可以互相转换 (3)NSRunLoop是基于CFRunLoopRef的一层OC包装,所以要了解RunLoop内部结构,需要多研究CFRunLoopRef层面的API(Core Foundation层面)
    RunLoop与线程的关系
    (1)RunLoop可以让线程不死,且一个runloop对应一个线程。
    (2)Runloop的创建:主线程Runloop已经创建好了,子线程的runloop需要手动创建
    (3)Runloop的生命周期:在第一次获取时创建,在线程结束时销毁

    Runloop应用
    1)NSTimer
    2)ImageView显示:控制方法在特定的模式下可用
    3)PerformSelector
    4)常驻线程:在子线程中开启一个runloop
    5)自动释放池
        第一次创建:进入runloop的时候
        最后一次释放:runloop退出的时候
        其它创建和释放:当runloop即将休眠的时候会把之前的自动释放池释放,然后重新创建一个新的释放池
  • 相关阅读:
    如何面试程序员?
    开始做项目
    ===
    依赖注入获得一个对象却想返回不同的值(Error)
    java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC]ResultSet can not reread row data for column 4.
    java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC]Object has been closed.
    .net 4.5新特性
    有限状态机简单示例
    JavaScript入门经典(第四版)文摘
    小强升职记读后感
  • 原文地址:https://www.cnblogs.com/iOSlearner/p/5454197.html
Copyright © 2020-2023  润新知