Objective-C是一门面向对象,并且在C的基础上加入了Smalltalk式的消息机制而形成的编程语言,它主要被苹果公司用于开发Mac OS X和iOS操作系统。既然Objective-C是面向对象的编程语言,那么我感兴趣的就是对象在内存中是怎么组织和表示的,消息机制又是怎么实现的。

0.NSObject

NSObject类和Java中的Object类有点相似,都是所有一切类的父类,也就是根类。那么NSObject又是一个怎样的类呢。打开NSObject.h头文件就可以看到NSObject的源码:

@interface NSObject <NSObject> { Class isa; }

可以看到NSObject是实现了NSObject protocol的Interface,它里面只包含了一个类型为Class的isa属性。isa是『is a』的意思,连起来就是『is a class』,也就是说这个属性保存了有关类的信息。同样来看一下Class的源码,它被定义在objc.h头文件中:

typedef struct objc_class *Class;

Class是objcclass类型,objcclass被定义在objc-class.h:

struct objc_class {          struct objc_class *isa; struct objc_class *super_class; const char *name; long version; long info; long instance_size; struct objc_ivar_list *ivars; #if defined(Release3CompatibilityBuild) struct objc_method_list *methods; #else struct objc_method_list **methodLists; #endif struct objc_cache *cache; struct objc_protocol_list *protocols; };

可以看到obj_class是一个结构体,它包含了所有运行时需要的有关类的信息,包括这个类的父类是什么类,实例变量,方法,协议等。有趣的是,obj_class中也有一个isa属性,那么它又指向哪里呢?它指向的是一个叫做metaclass的对象,并且类型也是obj_class。所以实例化一个类会有两个对象:本身和metaclass对象。这样做的目的是把实例方法的信息保存到自己本身的类中,而把类方法保存到metaclass类里。那么metaclass中的isa指向哪里呢?因为metaclass类是没有metaclass方法的,所有就不需要再多一个类来保存metaclass类的方法信息,因此,metaclass对象的isa指向自己,形成一个闭环结构。

1.消息机制

在Objective-C中,方法的调用和其他面向对象语言(例如Java)有点区别。在Java中的方法调用可以写成一般形式为:

object.method(argument);

但是在Objective-C里要这样写:

[object method:argument];

两者的区别是:Java的方法调用是直接调用实例对象的方法,而Objective-C则是发送消息一个消息。发送消息的目标在编译时是不知道的,而是在运行时决定。方法是由selector或者SEL确定的,也就是表示方法名的字符串。消息的接收对象不能保证一定会返回结果,当这种情况发生时就会抛出异常。

编译器会把发送消息的语句

[receiver message]

转换为:

objc_msgSend(receiver, selector, arg1, arg2, ...)

在objc_msgSend方法中做的是通过receiver和selector找到要调用的方法,这个方法的类型是IMP型的,然后就可以执行这个方法并把返回值返回出去。这里的IMP类型就是要调用方法的C语言实现,也就是一个C函数指针。

2.id

id被定义在objc.h中:

typedef struct objc_object { Class isa; } *id;

可以看到id就是objc_object结构体,它包含了一个isa指针指向类的描述信息,这样的话id就可以用来动态描述类的类型了。

id的作用类似于Javascript中的var,也就是说用id关键字声明的变量在编译时并不知道其具体类型,而是在运行时决定。因为有id关键字的存在,所以Objective-C就不是单纯的面向对象语言,而是面向对象语言和动态语言的混合体,从这点来看Objective-C倒跟C#有点像。

转载于:https://www.cnblogs.com/weiboyuan/p/3992858.html

Objective-C的对象模型相关推荐

  1. 唐巧的iOS技术博客选摘

    1. 那些被遗漏的objective-c保留字:http://blog.devtang.com/blog/2013/04/29/the-missing-objc-keywords/ 2. 使用cras ...

  2. iOS 面试基础题目

    转载: iOS 面试基础题目 题目来自博客:面试百度的记录,有些问题我能回答一下,不能回答的或有更好的回答我放个相关链接供参考. 1面 Objective C runtime library:Obje ...

  3. Objective C内存管理之理解autorelease------面试题

    Objective C内存管理之理解autorelease Autorelease实际上只是把对release的调用延迟了,对于每一个Autorelease,系统只是把该Object放入了当前的Aut ...

  4. 【C++】C++对象模型:对象内存布局详解(C#实例)

    C++对象模型:对象内存布局详解 0.前言 C++对象的内存布局.虚表指针.虚基类指针解的探讨,参考. 1.何为C++对象模型? 引用<深度探索C++对象模型>这本书中的话: 有两个概念可 ...

  5. python对象模型 ruby_使用JRuby/Jython实现Ruby/Python的互操作性?

    不,那不行.至少不是你想的那样.在 Jython和JRuby之间的互操作性与CPython和YARV之间的工作方式相同:它们都运行在同一个平台上,因此可以使用该平台彼此通信.在 在CPython和YA ...

  6. Sharepoint学习笔记—ECMAScript对象模型系列-- 8、组与用户操作(一)

    这里总结一下关于使用ECMAscript对象模型来操作Goup与User的常用情况,因为内容较多,所以拆分为两个部分,这部分主要内容如下:      1.取得当前Sharepoint网站所有的Grou ...

  7. BOM 浏览器对象模型和DOM 文档对象模型

    浏览器对象模型BOM 1. 浏览器对象模型介绍 BOM(Browser Object Model) 是指浏览器对象模型,是用于描述这种对象与对象之间层次关系的模型,浏览器对象模型提供了独立于内容的.可 ...

  8. 对象模型创建SharePoint2010多选字段SPFieldMultiChoice

    在使用页面方式创建SharePoint 2010的选项(Choice)字段时,选项字段的显示方式有3种:下拉列表.单选按钮.多选.但是如果使用对象模型创建时,下拉列表和单选按钮只能使用SPFieldC ...

  9. Kubernetes对象模型

    在之前的文章已经讲到了很多Kubernets对象,包括pod,service,deployment等等.Kubernets对象是一种持久化,表示集群状态的实体.它是一种声明式的意图的记录,一般使用ya ...

  10. MAVEN项目对象模型,原来找Bug也不用如此费时费事。

    解释之前,提个小问题 假如你正在Eclipse下开发两个Java项目,姑且把它们称为A.B,其中A项目中的一些功能依赖于B项目中的某些类,那么如何维系这种依赖关系的呢? 很简单,这不就是跟我们之前写程 ...

最新文章

  1. 成功解决AttributeError: Parent variable ‘<Variable: ID (dtype = numeric)>‘ is not the index of entity En
  2. OJ题目细菌实验分组c语言,C语言
  3. 多线程基础知识了解一下
  4. nginx php实例,多个mysql,nginx,php实例环境安装zabbix(完全自定义)
  5. 发布一个biztalk 解析Excel文件到xml消息的管道组件
  6. hazelcast集群配置_使用HazelCast进行Hibernate缓存:基本配置
  7. Oracle客房管理系统论文,[转载]基于WEB的酒店管理系统论文【1】
  8. toCharArray()和 charAt()的用法
  9. 关联 VMware 产品的内部版本号和版本 (1014508)
  10. Win2008学习(九),Remote App发布MSI格式程序
  11. PyTorch实现的ResNet50、ResNet101和ResNet152
  12. 收到短信:【淘会员】加微信免费赠礼品!是什么套路?这类短信如何发
  13. RC电路的充放过程C语言实现,一文讲解RC电路耦合、相移、滤波、微分、积分......
  14. Matlab绘制二维圆环和三维圆环
  15. Learning Cocos2d-x for XNA(6)——场景切换和场景过渡效果
  16. 双网卡teamviewer linux,钉钉远程打卡2019实践录
  17. 走进GBase 8s之高可用功能(二)HAC灾备高可用
  18. 揭秘:如何只用一个软件分析股市数据?
  19. Ajax方式实现文件的下载
  20. 经典英伦分毕业论文答辩PPT模板

热门文章

  1. 数据通信与计算机网络第2版,数据通信与计算机网络(第2版)习题1
  2. 高光谱遥感数据集下载及简介
  3. 技术思辨:GCN和CNN到底有什么差别?
  4. 如何开发神经网络来预测电离层中的干扰
  5. python写的crf训练代码
  6. 分类算法学习(三)——逻辑回归算法的原理及简单实现
  7. 【转载】 CNN(卷积神经网络)、RNN(循环神经网络)、DNN(深度神经网络)概念区分理解
  8. Alpine linux 没有apt-get安装软件方法 安装vim
  9. linux系统常见的压缩命令,Linux 系统常见的压缩指令
  10. JavaSE基础——Map集合、 Collections(集合工具类)