`
反求诸己
  • 浏览: 543281 次
  • 性别: 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是在C语言基础上扩展的,引入了Smalltalk的面向对象特性,如消息传递机制,使得代码更加灵活和可扩展。 "第二讲 数据类型、运算符和表达式"深入讲解了基本的数据类型,包括整型、浮点型、字符型等,以及...

    Objective-C 2.0 运行时系统编程指南

    3. **消息**:详细解释了Objective-C中的消息机制及其工作原理。 4. **动态方法解析**:介绍如何在运行时动态解析并加载新类。 5. **消息转发**:讲解了在找不到相应方法时如何进行消息转发的技术。 6. **类型...

    Objective-C高级编程 iOS与OS X多线程和内存管理_Objective-C_ios_

    内存管理是任何程序设计中不可忽视的部分,Objective-C采用引用计数(Reference Counting)和ARC(Automatic Reference Counting)两种机制来实现。引用计数是Objective-C早期的内存管理方式,它要求开发者手动管理...

    Objective-C 运行环境原理

    - **消息传递**:Objective-C 的核心是消息传递机制。当调用一个方法时,实际上是向对象发送一条消息,由运行时系统负责找到并调用相应的实现。 - **动态方法解析**:如果运行时系统在查找方法时未找到匹配的方法...

    Objective-C基础教程(Learn Objective-C)随书源码下载

    Objective-C通过消息传递机制实现了这些概念,使得代码更加模块化和可维护。 2. **类与对象**: 类是对象的蓝图,定义了对象的属性(ivar,实例变量)和行为(方法)。Objective-C中的对象是通过类创建的,每个...

    Objective-C专业书籍汇总pdf

    读者将学习如何定义类,理解消息传递机制,这是Objective-C的核心概念。书中还会涵盖对象生命周期,如初始化和释放,以及如何使用属性和协议来增强类之间的交互。此外,还可能介绍Foundation框架的基础知识,如字符...

    objective-c编程 第2版=objective-c program 2nd edition_13889311

    Objective-C是C语言的超集,它在C的基础上添加了面向对象的概念,如类、消息传递和协议等。这使得Objective-C既具有C的底层控制能力,又具备了现代编程语言的灵活性和可扩展性。在"Objective-C编程 第2版"中,可能...

    Objective-C基础教程源代码 Learn objective-C on the Mac Mark Dalrymple著书

    3. **消息传递**:Objective-C的核心机制是消息传递,类似于其他语言中的方法调用。理解`[receiver message]`的语法,以及如何使用点语法(object.property或object.method)。 4. **Foundation框架**:Objective-C...

    Effective Objective-C 2.0

    2. 类和消息机制:Objective-C语言的核心概念之一是类(Class)和消息传递(Message Sending)。类是创建对象的模板,而对象间的交互是通过消息传递来完成的。这种机制是Objective-C语言区别于其他编程语言的关键...

    Objective-C2.0程序设计习题官方答案

    1. **基础语法**:Objective-C的基础语法与C语言类似,但增加了消息传递机制。如类的定义、对象的创建、方法的声明与实现等。学习时需要掌握如何定义一个类,以及如何通过`@interface`、`@implementation`和`@end`...

    Objective-C - Learning Objective-C 2.0 Second Edition

    其中第五章《Messaging》介绍了Objective-C特有的消息传递机制,这是该语言区别于其他面向对象语言的关键特性之一。 #### 七、类与对象 第六章《Classes and Objects》详细阐述了如何定义和使用类及对象。本章通过...

    Objective-C程序设计 第6版 PDF

    - **第5章:消息传递**:Objective-C通过消息传递机制实现对象间通信,这一章节将详细介绍消息发送的过程及注意事项。 - **第6章:内存管理**:Objective-C的内存管理机制,包括引用计数、自动引用计数(ARC)等。 ##...

    objective-c 运行原理

    - **消息**:详细解释Objective-C中的消息传递机制。 - **动态方法解析**:探讨如何在运行时动态解析和替换方法实现。 - **消息转发**:讲解当对象无法响应消息时如何进行消息转发。 - **类型编码**:介绍如何在运行...

    Object-Oriented Programming with Objective-C

    Objective-C的一个显著特点是它的消息传递机制,这使得它与其他面向对象语言如Java或C++有所不同。在Objective-C中,调用一个方法实际上是在向一个对象发送一条消息,这种机制简化了代码的编写,同时也提供了更灵活...

    Objective-C 2.0运行时系统编程指南

    总结来说,Objective-C 2.0运行时系统编程指南为读者提供了一套关于Objective-C运行时系统操作的全面介绍,涵盖了从运行时系统的原理到具体的应用实践。无论是新手还是有经验的开发者,都能从中获得价值,特别是在...

    Objective-c for absolute beginners英文版

    它是C语言的超集,并添加了Smalltalk风格的消息传递机制。作为初学者的入门教材,本书首先会介绍Objective-C的基本语法和编程概念。 **iOS开发入门** 本书作为iOS编程的入门教材,将引导完全没有编程经验的新手学会...

Global site tag (gtag.js) - Google Analytics