OC运行机制是指,可以运行的时候动态调用函数。因为C语言必须在编译的时候就决定调用哪个函数。

我们平时写的OC代码,它在运行的时候也是转换成了runtime的方式运行的。任何方法调用本质:就是发送一个消息。(用runtime发送消息,OC底层通过runtime实现)每一个OC的方法,底层必然有一个与之对应的runtime运行方法。也就是说任何方法调用,都是转换为消息机制。

面试题:说说IOS 消息机制方法调用的过程:

1.OC在向一个对象发送消息时,runtime库会根据对象的isa指针来找到这个对象对应的类,或者父类中查找对应的方法。

2.注册方法编号(用编号的好处就是可以快速的查找)。

3.根据方法编号去查找对应的方法。

4.找到最终实现函数的地址,根据地址去方法区去调用对应的函数。

那么,一个OC对象的isa指针指向什么?有什么作用?

每个对象的内部都有一个isa指针,这个指针是指向他的真实类型。根据这个类的指针就能知道将来调用哪个类的方法。

总结:

1.每一个类本质上都是一个类的实例。其中类定义了成员变量和成员方法的列表。对象通过isa指针指向所属的类。

2.每一个类本质上都是一个对象。类其实是元类(meteClas)的实例。元类定义了类方法的列表。类通过类isa指针指向元类。

3.元类保存了类方法的列表。当类方法被调用的时候,会先从本身查找类方法的实现,如果没有找到,元类会向其父类查找该方法。需要注意的是,元类也是类,也是一个对象。

4.元类通过其isa指针指向他的根元类。(root meteClass)

5.根元类的isa指针指向了他本身。这样行程了一个封闭的内循环。

IOS runtime运行机制详解(一)的更多相关文章

  1. JavaScript运行机制详解

    JavaScript运行机制详解   var test = function(){ alert("test"); } var test2 = function(){ alert(& ...

  2. PULL解析XML的运行机制详解

    PULL解析简单易上手,基本上看一遍,基本上就会解析啦,但总是感觉对PULL解析的运行机制不是很了解,就总结了以下事件驱动到底是怎么执行的.. PULL: Android内置了PULL解析器.PULL ...

  3. Linux find运行机制详解

    本文目录: 1.1 find基本用法示例 1.2 find理论部分 1.2.1 expression-operators 1.2.2 expression-options 1.2.3 expressi ...

  4. [转载]JavaScript 运行机制详解:再谈Event Loop

    https://app.yinxiang.com/shard/s8/sh/b72fe246-a89d-434b-85f0-a36420849b84/59bad790bdcf6b0a66b8b93d5e ...

  5. 【朴灵评注】JavaScript 运行机制详解:再谈Event Loop

    PS: 我先旁观下大师们的讨论,得多看书了~   别人说的:“看了一下不觉得评注对到哪里去,只有吹毛求疵之感. 比如同步异步介绍,本来就无大错:比如node图里面的OS operation,推敲一下就 ...

  6. JavaScript 运行机制详解:再谈Event Loop

    原文地址:http://www.ruanyifeng.com/blog/2014/10/event-loop.html 一年前,我写了一篇<什么是 Event Loop?>,谈了我对Eve ...

  7. JavaScript 运行机制详解:深入理解Event Loop

    Philip Roberts的演讲<Help, I'm stuck in an event-loop>,详细.完整.正确地描述JavaScript引擎的内部运行机制. 一.为什么JavaS ...

  8. javascript运行机制详解: 再谈Event Loop(转)

    作者: 阮一峰 日期: 2014年10月 8日 一年前,我写了一篇<什么是 Event Loop?>,谈了我对Event Loop的理解. 上个月,我偶然看到了Philip Roberts ...

  9. 如何通过setTimeout理解JS运行机制详解

    setTimeout()函数:用来指定某个函数或某段代码在多少毫秒之后执行.它返回一个整数,表示定时器timer的编号,可以用来取消该定时器. 例子 ? 1 2 3 4 5 console.log(1 ...

随机推荐

  1. LINQ交集/并集/差集/去重

    using System.Linq; List<string> ListA = new List<string>(); List<string> ListB = n ...

  2. shell脚本报错:syntax error: unexpected end of file

    解决办法1: vi test.sh :set fileformat=unix :wq 解决办法2: yum install dos2unix dos2unix my.sh 原因剖析: DOS下文件和L ...

  3. 两种库解析、构造 JSON

    1.用CJSON库 1.1解析Json 需要解析的JSON文件: { "name":"Tsybius", , "sex_is_male":t ...

  4. 表情的战争(App名称)技术服务支持

    1.进入游戏走过场动画,可以点击退出跳过此过场动画: 2.进入主界面后直接点击开始游戏进入场景跑图,进入npc对话面板,对话结束进入战斗面板: 3.战斗操作方法为玩家拖动表情牌,进行攻击或者防守,直至 ...

  5. jq元素拖拽

    <div id="a1"></div> js <script type="text/javascript"> $(funct ...

  6. 我与C++的初识

    Q1:学习<C++语言程序设计>课程之前,你知道什么是编程吗?谈谈上这门课之前你对编程的理解,以及你对自己编程能力的评估. A1:在学习<C++语言程序设计>课程之前,我其实对 ...

  7. zookeeper注册与发现

    pom.xml添加如下引用: <dependency> <groupId>org.apache.zookeeper</groupId> <artifactId ...

  8. No module named 'pip._internal'

    报错: Traceback (most recent call last):File "/home/myuser/.local/bin/pip", line 7, in <m ...

  9. django的url反向解析

    目的:防止页面中url地址改变,其他与这个URL地址有关联的都要改,减少耦合度 使用:主要分为在html中和视图函数中的使用 HTML中的使用: 如果我们在项目的url文件中通过include导入了应 ...

  10. redis 无序集合(set)函数

    sAdd 命令/方法/函数 Adds a value to the set value stored at key. If this value is already in the set, FALS ...