美文网首页面试题目
runtime运行时 isa指针 SEL方法选择器 IMP函数指

runtime运行时 isa指针 SEL方法选择器 IMP函数指

作者: d76d0c9d2b04 | 来源:发表于2017-12-22 16:37 被阅读22次

    概述

    runtime:Objective-C是动态语言,它将很多静态语言在编译和链接时做的事放到了运行时,这个运行时系统就是runtime。

    runtime其实就是一个库,它基本上是用C和汇编写的一套API,这个库使C语言有了面向对象的能力。

    静态语言:在编译的时候会决定调用哪个函数。

    动态语言(OC):在运行的时候根据函数的名称找到对应的函数来调用。

    isa:OC中,类和类的实例在本质上没有区别,都是对象,任何对象都有isa指针,它指向类或元类(元类后面会讲解)。

    SEL:SEL(选择器)是方法的selector的指针。方法的selector表示运行时方法的名字。OC在编译时,会依据每一个方法的名字、参数,生成一个唯一的整型标识(Int类型的地址),这个标识就是SEL。

    IMP:IMP是一个函数指针,指向方法最终实现的首地址。SEL就是为了查找方法的最终实现IMP。

    Method:用于表示类定义中的方法,它的结构体中包含一个SEL和IMP,相当于在SEL和IMP之间作了一个映射。

    消息机制:任何方法的调用本质就是发送一个消息。编译器会将消息表达式[receiver message]转化为一个消息函数objc_msgSend(receiver, selector)。

    Runtime的使用:获取属性列表,获取成员变量列表,获得方法列表,获取协议列表,方法交换(黑魔法),动态的添加方法,调用私有方法,为分类添加属性。

    什么是runtime运行时

    概述中已经说了,runtime其实就是一个库,这个库主要做了两件事情:

    1. 封装:runtime把对象用C语言的结构体来表示,方法用C语言的函数来表示。这些结构体和函数被runtime封装后,我们就可以在程序运行的时候,对类/对象/方法进行操作。

    2. 寻找方法的最终执行:当执行[receiver message]的时候,相当于向receiver发送一条消息message。runtime会根据reveiver能否处理这条message,从而做出不同的反应。

    在OC中,类是用Class来表示的,而Class实际上是一个指向objc_class结构体的指针。

    主要依据:

    iOS黑魔法-Method Swizzling     

    ##runtime的一些使用

    -获取类的属性列表

    -获取类的方法列表

    -获取类的协议列表

    -获取类的成员变量列表

    -改变私有变量的值

    -为一个类增加新方法

    -为类的category 增加新的属性

    -交换方法

    -自动归档/解档

    runtime的正确使用

    相关文章

      网友评论

        本文标题:runtime运行时 isa指针 SEL方法选择器 IMP函数指

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