`
反求诸己
  • 浏览: 532718 次
  • 性别: Icon_minigender_1
  • 来自: 湖南娄底
社区版块
存档分类
最新评论

Objective-C消息机制的原理(转)

阅读更多

转自:http://my.oschina.net/amoyai/blog/94561

在Objective-C中,message与方法的真正实现是在执行阶段绑定的,而非编译阶段。编译器会将消息发送转换成对objc_msgSend方法的调用。

    objc_msgSend方法含两个必要参数:receiver、方法名(即:selector),如:
    [receiver message]; 将被转换为:objc_msgSend(receiver, selector);
 
    objc_msgSend方法也能hold住message的参数,如:
    objc_msgSend(receiver, selector, arg1, arg2, …);
  
    objc_msgSend方法会做按照顺序进行以下操作,以完成动态绑定:
  1. 查找selector所指代的程序(方法的真正实现)。因为不同类对同一方法有不同的实现,所以对方法的真正实现的查找依赖于receiver的类
  2. 调用该实现,并将一系列参数传递过去
  3. 将该实现的返回值作为自己的返回值,返回之
    消息传递的关键是,编译器构建每个类和对象时所采用的数据结构。每个类都包含以下两个必要元素:
  • 一个指向父类的指针
  • 一个调度表(dispatch table)。该调度表将类的selector与方法的实际内存地址关联起来

 

    每个对象都有一个指向所属类的指针isa 。通过该指针,对象可以找到它所属的类,也就找到了其全部父类,如下图所示:
 
    当向一个对象发送消息时,objc_msgSend方法根据对象的isa 指针找到对象的类,然后在类的调度表(dispatch table)中查找selector。如果无法找到selector,objc_msgSend通过指向父类的指针找到父类,并在父类的调度表(dispatch table)中查找selector,以此类推直到NSObject 类。一旦查找到selector,objc_msgSend方法根据调度表的内存地址调用该实现。 通过这种方式,message与方法的真正实现在执行阶段才绑定。
 
    为了保证消息发送与执行的效率,系统会将全部selector和使用过的方法的内存地址缓存起来。每个类都有一个独立的缓存,缓存包含有当前类自己的 selector以及继承自父类的selector。查找调度表(dispatch table)前,消息发送系统首先检查receiver对象的缓存。
  缓存命中的情况下,消息发送(messaging)比直接调用方法(function call)只慢一点点点点。
分享到:
评论

相关推荐

    objective-c 运行原理

    Objective-C+2.0+运行时系统编程指南,pdf格式,带你深入了解objective-c的工作机制。

    iPhone Mac Objective-C内存管理教程和原理剖析

    初学objectice-C的朋友都有一个困惑,总觉得对objective-C的内存管理机制琢磨不透,程序经常内存泄漏 或莫名其妙的崩溃。我在这里总结了自己对objective-C内存管理机制的研究成果和经验,写了这么一个由 浅入深的...

    Objective-C内存管理教程和原理剖析

    Objective-C的内存管理机制与.Net/Java那种全自动的垃圾回收机制是不同的,它本质上还是C语言中的手动管理方式,只不过稍微加了一些自动方法。 1 Objective-C的对象生成于堆之上,生成之后,需要一个指针来指向它。 ...

    oc内存管理.

    iPhone/Mac Objective-C 内存管理教程和原理剖析 初学 objectice-C 的朋友都有一个困惑,总觉得对 objective-C 的内存管理 机制琢磨不透,程序经常内存泄漏或莫名其妙的崩溃。我在这里总结了自己对 o bjective-C 内存...

    objective—c内存管理教程和原理

    一本详细阐述objective c中得内存机制的教程类书籍,希望给大家提供帮助

    iOS 内存管理机制 详细解读

    5.1)Objective-C内存管理相关术语 5.2)什么是引用计数? 5.2.1)引用计数解释 5.2.2)文艺解释 5.2.3)代码测试 5.3)自动释放池 5.3.1)AutoreleasePool的原理 5.3.2)自动释放池的创建和销毁 5.3.3)自动释放池的使用...

    cocoa基本原理指南

    2. "Cocoa对象" 解释Objective-C的基本用法和优点,以及 Cocoa对象的常见行为、接口、和生命周期。 3. "为Cocoa程序添加行为" 描述如何使用Cocoa框架来编写程 序,解释如何创建一个子类。 4. "Cocoa的设计模式" 描述...

    iOS开发中实现hook消息机制的方法探究

    在Objective-C中调用一个方法,其实是向一个对象发送消息,查找消息的唯一依据是selector的名字。利用Objective-C的动态特性,可以实现在运行时偷换selector对应的方法实现,达到给方法挂钩的目的。 每个类都有一个...

    Cocoa基本原理指南(2010年4月16日).zip

    2. "Cocoa对象" 解释Objective-C的基本用法和优点,以及 Cocoa对象的常见行为、接口、和生命周期。 3. "为Cocoa程序添加行为" 描述如何使用Cocoa框架来编写程 序,解释如何创建一个子类。 4. "Cocoa的设计模式" 描述...

    iOS高级程序员进阶——语法雷区篇

    无论是Objective-C语言还是Swift语言,其都有非常巧妙的设计思想与丰富的语法特性。在编写程序时,编程语言是最基础的工具,工具是否用的顺手会直接影响到所编写程序的效率与质量。还有很多时候,一种场景我们知道...

    object c/iphone 开发 试题

    17.objc使用消息机制来调用方法,消息就是一个类或者对象可以执行的动作 消息表达式:[对象或者类名字 方法名字:参数序列]; 对象或者类名字:接收器,是消息的接收者; 方法名字:参数序列:要发送的消息(要执行的...

    Cocos2D-X游戏开发技术精解

    2.3.2 Objective-C与C++的混合编译 41 2.4 引擎的启点 42 2.4.1 应用程序入口 43 2.4.2 引擎应用入口 44 2.5 丰富的示例程序 46 2.5.1 TestCpp示例项目 46 2.5.2 脚本示例项目 47 2.5.3 MoonWarriors示例项目 47 2.6...

    《iPhone开发实战》.(Christopher Allen).pdf

    第10章 objective-c和iphone os128 10.1 下载sdk128 10.1.1 安装sdk128 10.1.2 sdk剖析130 10.2 objective-c介绍131 10.2.1 概述131 10.2.2 消息132 10.2.3 类定义133 10.2.4 属性135 10.2.5 ...

    YSBlockHook:A runtime block hook mechanism(一个运行时的 block hook 机制)

    YSBlockHookA runtime block hook mechanism(一个运行时的 block hook 机制)。实现原理的介绍请参考文章:

    LDJSBridge_IOS:IOS平台零修改集成到产品的JSBridge简化框架

    本LDJSBridge_IOS是基于Phonegap的Cordova引擎的基础上简化而来,其基本原理参照Cordova的引擎原理如图所示: 在Cordova的基础上我们进行了简化,通过JSAPIService服务的方式进行插件扩展开发如图所示: 如何开发...

    OC简单实现代理

    OC代理机制原理。简单代理的实现步骤和代码实例(入门级别)

    Android 从观察者模式到DataBinding

    做过 iOS 的同学应该都了解过 KVO,是观察者模式在 Objective­C 中的应用。使用 KVO,能很方便的实现对对象属 性的监听,参见探索KVC/KVO的实现原理­KVC 一 和 探索KVC/KVO的实现原理­KVO 二 虽然 iOS 提供了对...

Global site tag (gtag.js) - Google Analytics