Objective-C 消息传递机制详解

2016-02-19 11:53 2 1 收藏

下面图老师小编跟大家分享一个简单易学的Objective-C 消息传递机制详解教程,get新技能是需要行动的,喜欢的朋友赶紧收藏起来学习下吧!

【 tulaoshi.com - 编程语言 】

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

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

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

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

id objc_msgSend(id receiver, SEL 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的是如何查找方法的具体实现位置呢,从网上找了一下,如下:

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

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)指向父类的指针一个调度表(dispatch table),调度表将类的selector与方法的实际内存地址关联起来。

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

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

查找过程如下

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

来源:https://www.tulaoshi.com/n/20160219/1598969.html

延伸阅读
解析XML 本文以解析本地XML为例,网络获取到的返回值只需转换成NSData型,解析是同理 需要解析的xml文件如下,users.xml ?xml version="1.0" encoding="UTF-8"?AllUsers message用户信息/message user name芳仔小脚印/name age10/age schoolJiangSu University/school /user user name毒虫/name age22/age schoolNanJing Uni...
一、字符串切割 1、带节点的字符串,如@"p讨厌的节点br//p"我们只想要中间的中文 处理方法: 代码如下: NSString *string1 = @"p讨厌的节点br//p";   /*此处将不想要的字符全部放进characterSet1中,不需另外加逗号或空格之类的,除非字符串中有你想要去除的空格,此处 p /等都是单独存在,不作为整个字符*/   NSCharacterSet *...
标签: Web开发
需要帮助来理清 XML 消息传送协议吗?本文回顾了不同主流的传输层协议并比较了它们如何在不同应用间可靠地传送 XML。您将看到如何将 XML-RPC, SOAP, WDDX, ebXML 和 JMS 作为 XML 传输协议的概要介绍以及示例代码。 在 XML 出现的三年中,在开发人员中讨论甚至争论最为激烈的是词汇(vocabulary)和方言(dialect) -- 换而言之,在双方间...
空字符串 在ios应用中,如果从网络请求数据,返回json或者是xml格式的数据时,经常会遇到空串,一般接口是用java等语言写的,如果是安卓,因为源语言都是java,只需判断是否等于null即可,但是在ios中会出现各种各项的形式,比如null,(null),null。 如果单纯用 代码如下: string!=nil; 无法判断出尖括号的空串 完整判断方法 代码如下: ...
Windows系统是一个消息驱动的OS,什么是消息呢?下面从不同的几个方面讲解一下。 1、消息的组成:一个消息由一个消息名称(UINT),和两个参数(WPARAM,LPARAM)。当用户进行了输入或是窗口的状态发生改变时系统都会发送消息到某一个窗口。例如当菜单转中之后会有WM_COMMAND消息发送,WPARAM的高字中(HIWORD(wParam))是命令的ID号,对菜单...

经验教程

327

收藏

72
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部