obj-c编程01[扩展学习01]:对象消息机制工作原理

    obj-c中的类就像C语言中的struct。NSObject类声明一个成员变量isa,因为NSObject类是整个继承树的根,所以每个类中都有一个isa其指向创建的对象。在类结构中有实例变量(成员变量)和其类型以及类中方法的实现,并且每个类都有一个指针指向其父类:

类中的方法通过选择器(selector)索引,选择器是SEL类型。类中每一个方法名字都映射成一个唯一的int值,例如方法addObject可能映射成整数12.作为obj-c数据结构的一部分,存在一个表,它将方法的名字映射到它们的选择器内,如下图:

在编译时,只要有消息产生编译器就查找选择器类来寻找方法,因此代码:

[ary addObject:obj_a];

被转换为(假设选择器映射表中addObject值为12)如下形式:

objc_msgsend(ary,12,obj_a);

在这里,objc_msgsend函数使用ary对象中的isa指针获得它的类结构,查找值与12相关联的函数。如果没有找到函数,则可以追踪指针至其父类。然后依次到父类的父类等等,最后到达树的顶端,如果此时仍然没有发现该函数,则抛出一个异常。

时间: 2024-09-17 04:35:50

obj-c编程01[扩展学习01]:对象消息机制工作原理的相关文章

ThinkPhp学习01

原文:ThinkPhp学习01 一.ThinkPHP的介绍           MVC  M - Model 模型                工作:负责数据的操作  V - View  视图(模板)        工作:负责前台页面显示  C - Controller 控制器(模块) 工作:描述功能 框架二.ThinkPHP的获取            http://www.thinkphp.cn三.ThinkPHP核心文件介绍      ├─ThinkPHP.php     框架入口文件 

Symbian编程总结-基础篇-活动对象正解(4)-异步函数的同步调用

在上一节里我们深入了解了活动对象.活动调度器及异步函数服务器的工作原理及运行机制,想必大家对活动对象的机制及体系结构的运用已经了如指掌.但是大家有没有觉得异步函数使用起来比较麻烦呢?难道非要使用活动对象,非得以"异步"的方式调用异步函数吗?这一节将为大家解决这个问题:异步函数的同步使用. 一.使用CActiveSchedulerWait类 在以前的文章"Symbian编程总结-界面篇-打开jpeg/gif/png图像"里我们已经看到了CActiveScheduler

SQL Server编程系列(2):SMO常用对象的有关操作

原文:SQL Server编程系列(2):SMO常用对象的有关操作 在上一篇周公简单讲述了SMO的一些基本概念,实际上SMO体系结构远不止周公在上一篇中讲述的那么简单,下图是MSDN上给出的一个完整的结构图: 上图是一个完整的涉及到各种关系的结构图.不过它们之间的层次结构关系周公已经在上一篇做了简单概述. 在本篇中周公还是在上一篇的基础上再做稍微深入一点的介绍,在本篇中主要讲述如何获取数据库常见对象信息,并且如何利用SMO来进行一些日常操作:如创建Login,创建数据库.备份数据库和还原数据库.

Javascript学习4 - 对象和数组

原文:Javascript学习4 - 对象和数组 在Javascript中,对象和数组是两种基本的数据类型,而且它们也是最重要的两种数据类型. 对象是已命名的值的一个集合,而数组是一种特殊对象,它就像数值的一组有序集合. 4.1 关联数组的对象 Objects as Associative Arrays     对于对象,其属性相当于已命名的字符串值的一个集合.可以使用数组存取运算符[]来提取属性.     对象可以使用"."来存取一个对象属性,而数组更常用的存取属性运算符是[].下面

chrome扩展学习 右键菜单实现代码_其它综合

manifest.json 复制代码 代码如下: { "name": "我的右键", "description": "chrome扩展学习---menu使用", "version": "0.1", "permissions": ["contextMenus", "tabs"], "background": {

关于编程的浅学习与深学习

导读:Tanky Woo的程序人生在博客中发表了<关于编程的浅学习与深学习>,文章是关于编程学习的一个提议.归纳.总结. 以下是文章全部内容: 关于编程的学习,大家肯定都知道,也是大家都说来说去的,就几句话: 1. 多看书. 2. 多看代码. 3. 多敲代码. 这些我不想多说,也觉得没有多说的必要. 经常在CSDN上看到有人问"我学习C++一段时间了,该如何进阶?",然后接着就是一大堆的人,重复这上面的三句话或者更多,我不是说这些方法是错的,我只是认为,这样没有点到本质,初

《linux c编程指南》学习手记2

第5章 使用make make寻找makefile的规则是在当前目录下依次查找3个文件----GNUmakefile文件,Makefile文件,makefile文件 第6章 进程控制 进程属性: 进程标识符 所占内存空间 相关文件描述符 安全信息 进程环境 信号处理 资源安排 同步处理 进程状态 system函数: 通过调用 fork exec waitpid函数完成,任何一个错误,都会导致system错误 本文转自博客园xingoo的博客,原文链接:<linux c编程指南>学习手记2,如需

《linux c编程指南》学习手记4

7.1 文件系统简介 7.1.1 文件 文件类型:普通文件.目录文件.链接文件.设备文件.管道文件 文件权限:r w x 访问权限:文件所有者.文件所有者同组用户.其他用户 7.1.2 索引节点 7.1.3 文件系统 树形层次结构系统,文件最终都归结到根目录/上 7.2 基于文件描述符的IO操作 7.2.1文件的创建.打开与关闭 1 文件的创建 create 2 文件的打开 open (文件操作不能保证都是成功的,因此文件操作都要进行检测,如果错误要终止程序) 3 文件的关闭 close 7.2

Symbian编程总结-基础篇-活动对象正解(3)-活动对象的工作原理

在上一节里我们已经知道如何创建和使用活动对象,大家对活动对象的创建.使用都有了一定的了解.在这一节里我将深入活动对象机制,分为"活动对象的工作流程"."信号迷失错误"两个部分,为大家剖析活动对象的工作原理. 一.活动对象工作流程 首先我们用时序图来说明一下应用程序.活动对象.活动调度器及异步函数服务器之间创建及调用的流程: 下面我们针对每一个步骤结合代码(点击此处下载代码)进行说明: 1.创建并安装活动调度器: CActiveScheduler* scheduler