前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >runtime运行时 isa指针 SEL方法选择器 IMP函数指针

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

原创
作者头像
conanma
修改2021-09-02 14:29:52
3020
修改2021-09-02 14:29:52
举报
文章被收录于专栏:正则正则

概述

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 增加新的属性

-交换方法

-自动归档/解档

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档