IOS runtime动态运行时一

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

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中的函数指针跳转到对应的函数中去执行。

时间: 2024-12-17 08:26:56

IOS runtime动态运行时一的相关文章

iOS运行时(Runtime)总结

声明 本博客中文章不会在此处再更新,只会在微信公众号中更新,请关注微信公众号,以获取最新的学习资源和更多学习资源.本博文末尾有微信公众号二维码,扫一扫添加关注. 原文出自:微信公众号iOSDevShares的文章 引言 相信很多同学都听过运行时,但是我相信还是有很多同学不了解什么是运行时,到底在项目开发中怎么用?什么时候适合使用?想想我们的项目中,到底在哪里使用过运行时呢?还能想起来吗?另外,在面试的时候,是否经常有笔试中要求运用运行时或者在面试时面试官会问是否使用过运行时,又是如何使用的? 回

iOS - OC RunTime 运行时

1.运行时 运行时是苹果提供的纯 C 语言的开发库,是一种非常牛逼.开发中经常用到的底层技术. 1.1 运行时原理 Objective-C 是一门简单的语言,95% 是 C,只是在语言层面上加了些关键字和语法,真正让 Objective-C 如此强大的是它的运行时.它很小但却很强大,它的核心是消息分发. 1.Messages 执行一个方法,有些语言,编译器会执行一些额外的优化和错误检查,因为调用关系很直接也很明显.但对于消息分发来说,就不那么明显了.在发消息前不必知道某个对象是否能够处理消息.你

一起谈.NET技术,VB.NET和C#的发展与动态语言运行时

在去年微软的专业开发者大会上(Professional Developers Conference PDC 2008),微软就开发者在.NET平台上的未来做了详细的展望,本文我们将概括地来看一下即将到来的.NET 4.0 Framework的一些特性,以及全新的Microsoft 系编程语言,讨论下微软对于.NET Platform在接下来几年的长远展望. VB.NET和C#的联合发展 当前来自软件的最首要的信息之一是针对Microsoft Visual Basic .NET开发者的.VB.NE

VB.NET和C#的发展与动态语言运行时

在去年微软的专业开发者大会上(Professional Developers Conference PDC 2008),微软就开发者在.NET平台上的未来做了详细的展望,本文我们将概括地来看一下即将到来的.NET 4.0 Framework的一些特性,以及全新的Microsoft 系编程语言,讨论下微软对于.NET Platform在接下来几年的长远展望. VB.NET和C#的联合发展 当前来自软件的最首要的信息之一是针对Microsoft Visual Basic .NET开发者的.VB.NE

linux编程-Linux程序运行时,报找不到动态库,有谁碰到过吗?

问题描述 Linux程序运行时,报找不到动态库,有谁碰到过吗? arm 32位 LINUX 环境下,想要调用第三方的库 libmsc.so 和libwiringPi.so 都放在了/usr/local/lib目录下 , 同时在LD_LIBRARY_PATH 下增加了/usr/local/lib 操作系统自带 arm-linux-gcc 编译版本是4.6.3 libmsc.so是在4.4.3下编译生成的 运行 ldconfig -v 可以看到找到了 /usr/local/lib: libmsc.s

基于MFC的ActiveX控件,如何实现运行时,用户可动态调整控件大小和位置?

问题描述 基于MFC的ActiveX控件,如何实现运行时,用户可动态调整控件大小和位置? 基于MFC的ActiveX控件,如何实现运行时,用户可动态调整控件大小和位置? 请大神们帮帮忙.在线等. 解决方案 调整控件大小是宿主程序的事,不关activex 即便不写任何代码,都是可以调整大小的,只是如果你不写代码,调整控件大小,里面的内容不会跟着缩放,而是保持不变,如果尺寸变小,右下角的东西会看不见. 解决方案二: 在OnSize中写可动态调整控件大小和位置的代码 解决方案三: 有没有相关的列子可供

服务器-eclipse中无法创建动态web项目,报错运行时“Apache Tomcat v7.0”是无效的

问题描述 eclipse中无法创建动态web项目,报错运行时"Apache Tomcat v7.0"是无效的 应该点哪里如何操作解决这个,在线等,谢谢! 解决方案 window-perferences-server-Runtime environment,将邮编的server run environment中的内容移除再重新添加,因为其中有指定tomcat的安装路径,这个tomcat的位置变了,这个要重新设置一下 解决方案二: 楼上说的有道理,不过我是来蹭分升级的,谢谢合作

C程序写了一个简化的控制台的扫雷,想问下,怎么才能在每次运行时,动态随机埋雷?

问题描述 C程序写了一个简化的控制台的扫雷,想问下,怎么才能在每次运行时,动态随机埋雷? ```// Duplicate.cpp : Defines the entry point for the console application. // #include #include const int START_X = 27; const int START_Y = 13; const int MAX_X = 9; const int MAX_Y = 9; class Cube; void se

公共语言运行时CLR由CTS、CLS、JIT组成,请问C#编译器和VB.NET编译器属于CLR吗?

问题描述 公共语言运行时CLR由CTS.CLS.JIT组成,那么请问:C#编译器和VB.NET编译器属于CLR吗? 解决方案 解决方案二:这两者应该没关系吧.是两个东西,编译器是将C#VB代码编译成CLR可以执行的中间语言.解决方案三:CLR跟JVM的意义基本相等,就是一个运行时的环境.直接查一下定义就可以看到,"CLR的核心功能包括:内存管理.程序集加载.安全性.异常处理和线程同步".因此可以看到它跟编程语言无关.MFC跟编程语言其实是也无关,但是它显然几乎只是被特定语言接受,不如C