博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
IOS runtime动态运行时一
阅读量:6801 次
发布时间:2019-06-26

本文共 1714 字,大约阅读时间需要 5 分钟。

对运行时不太了解,今天小伙伴橄榄油陈高给发了个链接 ,看了一部分先存着以后慢慢品  

http://www.cocoachina.com/ios/20141018/9960.html

http://blog.csdn.net/kesalin/article/details/7211228

http://www.linuxidc.com/Linux/2014-05/102380.htm

今天一句一句的读了下 ,慢慢有了点感觉,把主要的截图贴在这以后好多看几遍

typedef struct objc_class *Class;struct objc_class {  Class isa; // 指向metaclass     Class super_class ; // 指向其父类  const char *name ; // 类名  long version ; // 类的版本信息,初始化默认为0,可以通过runtime函数class_setVersion和class_getVersion进行修改、读取  long info; // 一些标识信息,如CLS_CLASS (0x1L) 表示该类为普通 class ,其中包含对象方法和成员变量;CLS_META (0x2L) 表示该类为 metaclass,其中包含类方法;  long instance_size ; // 该类的实例变量大小(包括从父类继承下来的实例变量);  struct objc_ivar_list *ivars; // 用于存储每个成员变量的地址  struct objc_method_list **methodLists ; // 与 info 的一些标志位有关,如CLS_CLASS (0x1L),则存储对象方法,如CLS_META (0x2L),则存储类方法;  struct objc_cache *cache; // 指向最近使用的方法的指针,用于提升效率;  struct objc_protocol_list *protocols; // 存储该类遵守的协议    }

Class isa:指向metaclass,也就是静态的Class。一般一个Obj对象中的isa会指向普通的Class,这个Class中存储普通成员变量和对 象方法(“-”开头的方法),普通Class中的isa指针指向静态Class,静态Class中存储static类型成员变量和类方法(“+”开头的方 法)。

Class super_class:指向父类,如果这个类是根类,则为NULL。

isa是横向,对象--->普通类--->静态类,静态类指向根的isa,根的指向自己

superClass是纵向,子类--->父类,根的superClass为NULL

 

@selector (makeText):这是一个SEL方法选择器。SEL其主要作用是快速的通过方法名字(makeText)查找到对应方法的函数指针,然后调用其函 数。SEL其本身是一个Int类型的一个地址,地址中存放着方法的名字。对于一个类中。每一个方法对应着一个SEL。所以iOS类中不能存在2个名称相同 的方法,即使参数类型不同,因为SEL是根据方法名字生成的,相同的方法名称只能对应一个SEL。

下面我们就来看看具体消息发送之后是怎么来动态查找对应的方法的。

首先,编译器将代码[obj makeText];转化为objc_msgSend(obj, @selector (makeText));,在objc_msgSend函数中。首先通过obj的isa指针找到obj对应的class。在Class中先去cache中 通过SEL查找对应函数method(猜测cache中method列表是以SEL为key通过hash表来存储的,这样能提高函数查找速度),若 cache中未找到。再去methodList中查找,若methodlist中未找到,则取superClass中查找。若能找到,则将method加 入到cache中,以方便下次查找,并通过method中的函数指针跳转到对应的函数中去执行。

 

你可能感兴趣的文章
iOS:解决动画加阴影卡的问题
查看>>
PHP数组读取的循环操作
查看>>
[置顶] Oracle 11g Undo 表空间切换
查看>>
Andriod 环境配置以及第一个Android Application Project
查看>>
怎么解决浏览器兼容性问题
查看>>
从M个数中随机选出N个数的所有组合,有序,(二)
查看>>
hdu 1540 Tunnel Warfare(线段树区间统计)
查看>>
android 自定义按钮实现 home键 和返回键
查看>>
Android App测试要点
查看>>
深入理解C指针之三:指针和函数
查看>>
android(9)_数据存储和访问3_scard基本介绍
查看>>
eclipse自动部署问题
查看>>
Asp.Net验证码2
查看>>
Android APK反编译就这么简单 详解(附图)
查看>>
Python 随机数
查看>>
面向程序员的数据库访问性能优化法则
查看>>
创建, 发布自己的 Vue UI 组件库
查看>>
有关Android插件化思考
查看>>
redis 集群搭建以及redislive监测部署
查看>>
HTML5系列之meta
查看>>