01class的结构

元类对象和元类的结构是一样的,他是一种特殊的类对象

struct objc_class : objc_object {// Class ISA;isa_t isa;Class superclass;cache_t cache;             // formerly cache pointer and vtable方法缓存class_data_bits_t bits; //用来获取具体的类信息
}
类的内存结构

class_rw_t里面的methods、properties、protocols是二维数组,是可读可写的,包含了类的初始内容、分类的内容

class_rw_t的内容

class_ro_t里面的baseMethodList、baseProtocols、ivars、baseProperties是一维数组,是只读的,包含了类的初始内容,类当初我们声明的方法和属性协议,

class_ro_t里面的结构

方法02-method

method_t就是对函数/方法的封装,他的源码封装为

struct method_t {SEL name; //函数名 选择器 他就是一个名字。const char *types; //编码(返回值类型参数类型)MethodListIMP imp;//指向函数的指针(函数地址)
}
  • IMP代表函数的具体实现

    IMP

  • SEL代表方法\函数名,一般叫做选择器,底层结构跟char *类似
    可以通过@selector()和sel_registerName()获得
    可以通过sel_getName()和NSStringFromSelector()转成字符串
    不同类中相同名字的方法,所对应的方法选择器是相同的
typedef struct objc_selector *SEL;
  • types包含了函数返回值、参数编码的字符串

    types

方法03-Type%20Encoding

- (void)test;

通过转成源码的结构体类型,打印出方法的types是里面是v16@0:8
v=void返回值,16所有参数的字节数@第一个参数(self)0开始位子;:第二个参数IMP,8参数从第8个字节开始,每个方法都有这两个默认的参数

  • iOS中提供了一个叫做@encode的指令,可以将具体的类型表示成字符串编码
NSLog(@"%s",@encode(int));//iNSLog(@"%s",@encode(SEL));//:NSLog(@"%s",@encode(id));//@NSLog(@"%s",@encode(void));//v
类型转成字符1

类型转成字符2

04Cache_t

在objc_class结构体的里有个Cache_t 用来做方法缓存的

  • Class内部结构中有个方法缓存(cache_t),用散列表(哈希表)来缓存曾经调用过的方法,可以提高方法的查找速度。去缓存数组找的时候,他会先判断一下key是不是相同找的selector,如果相同就调用

因为假如一个方法要调用很多次的话,每次都进行isa遍历去查找,会很麻烦,性能比较低,所以,第一次调用的时候,把这个方法放到这个里面,不管这个方法之前在哪里都会给缓存到类对象的cache里面,方法缓存,下次通过isa找到类对象的时,调用的时候先到这个cache里面查找,候,有没有那个方法,没有的话再去按照之前的方式分层查找。

cache_t结构

key = @selector(personTest);
imp = personTest的地址

05散列表缓存方法

分析他去缓存中找的时候是怎么快速找到的,散列表里面装的也是数组一样的元素

//他是拿到key& _mask
@selector(studentTest)  & _mask = 4生成就是索引,这个值在他当初把方法放到缓存的时候就已经做好了。在往里面的放的时候,就是按照这个计算结果,将方法放到对应的位子,假设数组一开始为空的,那么他前面就是空的没有东西@selector(studentTest2)  & _mask = 2,他就会把它放到2纳那个位子,牺牲内存空间,来提升访问速度,因为可能会产生空的位子
,左边的值无论怎么变都<=右边的mask
如果两个方法的地址值生成的索引是一样的。
他寸纯的时候就会将这个值-1;
取的时候如果发现key和想要的不一样,那就-1;
如果到0,还没有,他就变成mask再一次次-1;
假设数组的长度不够了,他就会扩容,一旦扩容,他会将缓存清空

哈希表,就是用一个函数根据传入的key,计算出一个索引,如果索引冲突了,再进某种操作-1+1或者其他来解决这个冲突

散列表

06查看方法缓存

平时调用过的方法,就会放到cache之中,这样做的好处就是下次再调用这个方法的时候可以更快捷的找到他。就算方法是在父类的类对象里面找到也会缓存到自己类对象的cache里面。
让我们测试的类转成自己写的结构体,

07查看方法缓存

通过调用他父类的以及父类的父类的方法,然后查看结构体的cache,可以发现她也会将那些方法也放到缓存之后

GoodStudent *person = [[GoodStudent alloc] init];sl_objc_class *personClass = (__bridge struct sl_objc_class *)[GoodStudent class];[person goodStudentTest];[person studentTest];[person personTest];[person goodStudentTest];NSLog(@"-------------------");cache_t cache = personClass->cache;
//        bucket_t *buckets = cache._buckets;
//
//        bucket_t bucket = buckets[(long long)@selector(studentTest) & cache._mask];
//        NSLog(@"%s %p", bucket._key, bucket._imp);
//
//        for (int i = 0; i <= cache._mask; i++) {
//            bucket_t bucket = buckets[i];
//            NSLog(@"%s %p", bucket._key, bucket._imp);
//        }NSLog(@"%s %p", @selector(personTest), cache.imp(@selector(personTest)));NSLog(@"%s %p", @selector(studentTest), cache.imp(@selector(studentTest)));NSLog(@"%s %p", @selector(goodStudentTest), cache.imp(@selector(goodStudentTest)));

cache里面确实存在着他的父类的额方法

打印缓存方法


http://www.taodudu.cc/news/show-6887670.html

相关文章:

  • 手机上怎么打开md格式的文件_怎么提取pdf页面?职场达人教你一招
  • iOS 中使用Mupdf教程 pdf阅读器
  • 安卓手机实现无需下载即可预览pdf文件
  • 用Edge将GitHub上的markdown文件在线完美转pdf
  • ipad上html文件转pdf,两种方法快速实现iPad版Pages转换PDF
  • 五个最好的复制/粘贴的Mac App应用
  • 人生之道路
  • 【人生之路】与我联系
  • 我的学生...我的事业...我的人生路...
  • 漫步人生路
  • 人生路上
  • 人生路上没有毕业季
  • 风雪凋零人生路
  • YHL--------------------------------------------------人生路规划
  • 汽车科目一学习考试系统
  • 驾照理论考试速成软件 MFC源代码下载
  • 十年来,编程领域有什么重要进展?
  • Mac下使用Eclipse实现Android中调用C/C++(NDK)基础详细教程
  • C/C++基础题056.菱形
  • 七年级计算机c语言测试题,2017年初一下学期数学期末检测试题
  • C/C++基础题076.蛇形矩阵
  • c语言摄影测量共线方程,摄影测量中的共线条件方程
  • C/C++基础题073.数组的右方区域
  • 明码(蛇皮解法)——第九届蓝桥杯C语言B组(省赛)第二题
  • 数字方框
  • 蛇形矩阵 回形矩阵(学生视角最容易理解的方法)C语言 傻瓜式解题
  • 考研考C语言多还是JAVA多,我现在是一名大三的学生。我现在已经学过C语言,资料结构和资料库。如果想往计算机方面考研还需要学什么?...
  • 安卓逆向 --- java基础、ArrayList、LinkedList、HashMap、泛型、反射、逆向常见操作
  • LVM配置和管理
  • linux 磁盘挂载故障,LVM讲解和磁盘挂载故障

Runtime-方法相关推荐

  1. java实现进程管理,Java调用批处理或可执行文件和Runtime、Process类实现Java版进程管理器...

    Java调用批处理或可执行文件 用Java编写应用时,有时需要在程序中调用另一个现成的可执行程序或系统命令,这时可以通过组合使用Java提供的Runtime类和Process类的方法实现.下面是一种比 ...

  2. Runtime 总结

    参考文章 1. `文/滕先洪(简书作者)原文链接:http://www.jianshu.com/p/ab966e8a82e2著作权归作者所有,转载请联系作者获得授权,并标注"简书作者&quo ...

  3. iOS之runtime

    runtime 简介: 1.通过 Objective-C 直接编写 Objective-C 代码 在程序运行期间会自动将代码转换成相应的结构体和函数. 2.通过NSObject的方法 NSObject ...

  4. RunTime 入门

    原文链接:http://www.jianshu.com/p/59992507f875 这是一篇浅显实用 易记 易理解的关于runtime的解读. Runtime 中的方法主要以五个单词开头--clas ...

  5. 浅析Java.lang.Runtime类

    一.概述      Runtime类封装了运行时的环境.每个 Java 应用程序都有一个 Runtime 类实例,使应用程序能够与其运行的环境相连接.       一般不能实例化一个Runtime对象 ...

  6. Runtime.getRuntime().exec()

    Runtime.getRuntime()返回当前应用程序的Runtime对象,该对象 的exec()方法指示Java虚拟机创建一个子进程执行指定的可执行程序,并返回与该子进程对应的Process对象实 ...

  7. 回答我,停止 Goroutine 有几种方法?

    大家好,我是煎鱼. 协程(goroutine)作为 Go 语言的扛把子,经常在各种 Go 工程项目中频繁露面,甚至有人会为了用 goroutine 而强行用他. 在 Go 工程师的面试中,也绕不开他, ...

  8. iOS运行时-使用Runtime向Category中添加属性以及运行时介绍

    前言 了解OC的都应该知道,在一般情况下,我们是不能向Category中添加属性的,只能添加方法,但有些情况向,我们确实需要向Category中添加属性,而且很多系统的API也有一些在Category ...

  9. 深入研究java.lang.Runtime类【转】

    转自:http://blog.csdn.net/lastsweetop/article/details/3961911 目录(?)[-] javalang 类 Runtime getRuntime e ...

  10. [iOS] ios的runtime

    1. 什么是runtime 运行时刻是指一个程序在运行(或者在被执行)的状态.也就是说,当你打开一个程序使它在电脑上运行的时候,那个程序就是处于运行时刻.在一些编程语言中,把某些可以重用的程序或者实例 ...

最新文章

  1. (转)致李开复博士的一封信
  2. 如何使用Amazon Echo控制您的Eero Wi-Fi网络
  3. 使用文本编辑器和jdk_JDK 14:记录,文本块等
  4. 页面重构-让我们的布局自适应
  5. 【CodeForces - 202A】LLPS (思维,字符串)
  6. 数据结构与算法————九九乘法表
  7. 【java基础知识】判断字符串不为空
  8. 【成功不是等来的】生意不好问人不如问己!谈真实经验!
  9. cut最后几位 shell_shell命令_cut
  10. Service Mesh 如何重定义云原生计算?阿里服务网格技术大揭秘
  11. IPv6地址配置与应用
  12. 奔图打印机linux驱动rpm,奔图P2500打印机驱动
  13. UnicodeDecodeError: ‘gbk‘ codec can‘t decode byte 0xae in position解决办法
  14. 零基础CSS入门教程(30)–CSS布局实例
  15. 网易云MUSIC年终奖0.5?听到消息我扔了耳机
  16. uni-app——如何获取页面容器的高度
  17. 抖音数据 - 网民评论数据采集,分析
  18. Axure教程 axure新手入门基础(1)
  19. ssm报错:No qualifying bean of type ‘com.hr.service.LoginService‘ available
  20. 达梦数据库大小写敏感介绍

热门文章

  1. 在linux中删除多级目录,如何在Linux中删除目录
  2. 定制DataGridView快捷菜单ContextMenuStrip的关联事件
  3. 基于8086的波形发生器(汇编语言微机课设)
  4. git提交代码工具推荐
  5. Spring原理(二)--循环依赖原理
  6. htslib/sam.h库使用说明
  7. 字节跳动28岁程序员期权价值过亿提前退休
  8. 个体工商户属于小微企业吗_小型微利企业有优惠,个体工商户是否也要考虑呢?...
  9. Linux c/c++文件移动
  10. Ubuntu desktop amd64 安装及简单配置