Runtime

作者: 为什么划船不靠桨 | 来源:发表于2017-07-19 16:03 被阅读0次
    作为一个开发者,只是明白一些面上的东西是不够的,所以最近抽空学习了Runtime,今天做一下总结一下.

    Runtime(运行时机制),iOS内部的核心之一,包含很多强大实用的C语言数据类型和C语言函数,平时我们编写的OC代码,在编译器编译的时候都会变成C语言的代码,其底层都是基于runtime实现的。这也是说OC是一门动态语言的原因(运行时机制使我们直到运行时才去决定一个对象的类别,以及调用该类别对象指定方法),RunTime是OC底层的方法实现,正是Runtime使C语言有了面向对象的能力。利用Runtime机制可以动态产生(修改,删除)一个类,或者可以在程序运行时动态地修改类和对象中的所有属性和方法.
    Runtime 是一个运行时库,主要使用 C 和汇编写的库,为 C 添加了面向对象的能力并创造了 Objective-C,并且拥有消息分发,消息转发等功能。也就是 Runtime 涉及三个点,面向对象,消息分发,消息转发.Objective-C 的对象是基于 Runtime 创建的结构体。另外NSObject封装了部分接口:isKindOfClass: isMemberOfClass: methodForSelector: respondsToSelector: conformsToProtocol等等。

    使用RunTime的方式:
    1、普通代码底层就是RunTime在工作。
    2、直接调用RunTime的方法就可以使用RunTime。

    常用的头文件
    //包含对类、成员变量、属性、方法的操作
     #import <objc/runtime.h> 
    //包含消息机制
     #import <objc/message.h> 
    但是其实<objc/message.h>已经包含了<objc/runtime.h>
    
    我们首先需要了解的一些Runtime名字的含义
    typedef struct objc_class *Class; 类
    typedef struct objc_method *Method; 类中成员方法的类型
    typedef struct objc_ivar *Ivar;     成员变量的类型
    typedef struct objc_category *Category;  类目
    typedef struct objc_property *objc_property_t;  类中的属性
    typedef struct objc_object Protocol; 协议
    
    Runtime方法的规律:
    对对象进行操作的方法一般以object_开头
    对类进行操作的方法一般以class_开头
    对类或对象的方法进行操作的方法一般以method_开头
    对成员变量进行操作的方法一般以ivar_开头
    对属性进行操作的方法一般以property_开头开头
    对协议进行操作的方法一般以protocol_开头
    
    Objc 在三种层面上与 Runtime 系统进行交互:
    通过 Objective-C 源代码
    通过 Foundation 框架的 NSObject 类定义的方法
    通过对 Runtime 库函数的直接调用
    
    常用方法
     class_copyIvarList()返回一个指向类的成员变量数组的指针
     class_copyPropertyList()返回一个指向类的属性数组的指针
     注意:根据Apple官方runtime.h文档所示,上面两个方法返回的指针,在使用完毕之后必须free()。
    
     ivar_getName()获取成员变量名-->C类型的字符串
     property_getName()获取属性名-->C类型的字符串
    -------------------------------------
     class_getInstanceMethod()
     class_getClassMethod()以上两个函数传入返回Method类型
     ---------------------------------------------------
     method_exchangeImplementations()交换两个方法的实现
    

    runtime的大致内容就总结到这里,其具体用法我将会在后续文章中进行讲述.

    相关文章

      网友评论

          本文标题:Runtime

          本文链接:https://www.haomeiwen.com/subject/eablkxtx.html