Objective-C 消息传递机制详解

 更新时间:2012年11月21日 17:19:46   作者:  
Objective-C语言中方法的传递有二种:①Selector ② Blocks,本文主要说一下Selector,本文以Objective-C 消息传递机制进行详细介绍,关于Blocks会在后续总结一下

Objective-C语言中方法的传递有二种:①Selector ② Blocks,本文主要说一下Selector,关于Blocks会在后续总结一下。

消息传递模型(Message Passing)是Objective-C语言的核心机制。在Objective-C中,没有方法调用这种说法,只有消息传递。

在C++或Java中调用某个类的方法,在Objective-C中是给该类发送一个消息。在C++或Java里,类与类的行为方法之间的关系非常紧密,一个方法必定属于一个类,且于编译时就已经绑定在一起,所以你不可能调用一个类里没有的方法。而在Objective-C中就比较简单了,类和消息之间是松耦合的,方法调用只是向某个类发送一个消息,该类可以在运行时再确定怎么处理接受到的消息。也就是说,一个类不保证一定会响应接收到的消息,如果收到了一个无法处理的消息,那么程序既不会出错也不或宕掉,它仅仅是什么都不做,并返回一个nil【笔者添加:在编译期是不出错的,符合语义上的理解,但是runtime运行时的话,会崩溃】。这种设计本身也比较符合软件的隐喻。(非常nice,从网上看到的,copy过来了)

很显然,既然编译器不定位方法,那么只有运行期定位方法了,Objective-C又是怎么去运行期定位方位的呢?

id objc_msgSend(id receiver, SEL selector, ...)【包含二个必要参数:receiver(接受者对象)、selector(方法选择器)和一个未知参数(selector的参数列表)】

Objective-C就是通过上述方法来查找调用方法的~比如[itNoob cry]就被转换成objc_msgSend(itNoob,cry),这里receiver就是itNoob对象,selector就是cry选择器,当然如果cry拥有参数的话,会同样被转换,如[itNoob cry:@"呜呜" AndSmile:@"嘻嘻"]会被转换成objc_msgSend(itNoob,cry:AndSmile:,@"呜呜",@"嘻嘻"),类似如objc_msgSend(id receiver, SEL selector, parm1,parm2,...)。

objc_msgSend的动态绑定过程

    根据receiver对象去查找selector方法的具体实现位置调用查找到的实现,传递参数将方法实现的返回值作为自己的返回值,返回

那objc_msgSend的是如何查找方法的具体实现位置呢,从网上找了一下,如下:

编译器构建每个类的时候,每个类必须包含二个必要的元素:

指向父类的指针一个调度表(dispatch table),调度表将类的selector与方法的实际内存地址关联起来。

我们知道每个对象都有一个isa指针,指向所属类,通过这个isa指针可以找到对象的所属类和所属的父类...

查找过程如下

当想一个对象发送消息的时候,先根据isa找到所属的类,然后去查找该类的dispatch table,如果没有找到,就去其父类中查找...如果找到了,就根据调度表中的内存地址调用该实现,如果最后一直没有找到返回nil。

相关文章

  • C语言MultiByteToWideChar和WideCharToMultiByte案例详解

    C语言MultiByteToWideChar和WideCharToMultiByte案例详解

    这篇文章主要介绍了C语言MultiByteToWideChar和WideCharToMultiByte案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • 最新C/C++中的new和delete的实现过程小结

    最新C/C++中的new和delete的实现过程小结

    这篇文章主要介绍了C/C++中的new和delete的实现过程,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-06-06
  • 实例讲解C语言编程中的结构体对齐

    实例讲解C语言编程中的结构体对齐

    这篇文章主要介绍了C语言编程中的结构体对齐,值得注意的是一些结构体对齐的例子在不同编译器下结果可能会不同,需要的朋友可以参考下
    2016-04-04
  • C++取得本机IP的方法

    C++取得本机IP的方法

    这篇文章主要介绍了C++取得本机IP的方法,代码简单功能实用,具有不错的借鉴参考价值,需要的朋友可以参考下
    2014-10-10
  • 浅谈内联函数与宏定义的区别详解

    浅谈内联函数与宏定义的区别详解

    本篇文章是对内联函数与宏定义的区别进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C++实现简易五子棋游戏

    C++实现简易五子棋游戏

    这篇文章主要为大家详细介绍了C++实现简易五子棋游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-07-07
  • OpenCV 直方图均衡化的实现原理解析

    OpenCV 直方图均衡化的实现原理解析

    直方图均衡化是通过拉伸像素强度分布范围来增强图像对比度的一种方法,今天通过本文给大家介绍OpenCV 直方图均衡化的实现原理解析,感兴趣的朋友跟随小编一起看看吧
    2022-01-01
  • Qt使用SQLite数据库存储管理图片文件

    Qt使用SQLite数据库存储管理图片文件

    这篇文章主要为大家详细介绍了Qt如何使用SQLite数据库实现存储管理图片文件的功能,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
    2023-04-04
  • C++17中的折叠表达式实现

    C++17中的折叠表达式实现

    这篇文章主要介绍了C++17中的折叠表达式实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • C++ 构造双向链表的实现代码

    C++ 构造双向链表的实现代码

    本篇文章是对C++中构造双向链表的实现代码进行了详细的分析介绍,需要的朋友参考下
    2013-05-05

最新评论