Objective-C的对象模型 http://foredoomed.org/blog/2014/02/24/object-modeling-of-objective-c/
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是objc class类型,objc class被定义在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#有点像。
参考资料
[1] Objective-C Wiki
[2] Concepts in Objective-C Programming: Object Modeling
[3] Objective-C Runtime Programming Guide
Objective-C的对象模型 http://foredoomed.org/blog/2014/02/24/object-modeling-of-objective-c/的更多相关文章
- Blog总结02(4~6次作业总结)
Blog总结02(4~6次作业总结) 1.前言 (1)题目集04共有三道题目,第一题难度较大,第二题和第三题难度适中,第一题考察的知识点是 Java 中的字符串处理类以及正则表达式对输入字符串数据进行 ...
- mac 系统通用快捷键(mac 下的应用多数会往这些标准看齐)(转:http://yang3wei.github.io/blog/2013/02/08/chen-ni-yu-mac-chen-ni-yu-xcode/)
command + w: 关闭当前窗口 command + q: 退出程序 (Google Chrome 有点奇葩,按下之后还需要hold 那么一小会儿才能退出) command + m: 最小化当前 ...
- iOS面试3
转:http://studentdeng.github.io/blog/2014/02/11/baidu-interview/ 百度面试 FEB 11TH, 2014 | COMMENTS 百度移动云 ...
- https那些事儿
(一)SSL/TLS协议运行机制的概述 一.作用 不使用SSL/TLS的HTTP通信,就是不加密的通信.所有信息明文传播,带来了三大风险. (1) 窃听风险(eavesdropping):第三方可以获 ...
- iOS开发 runtime实现原理以及实际开发中的应用
自己写了一个小例子:有一些相关知识点和博客文章 A: 首先现在控制器里面初始化一个对象,然后调用对象的方法: #import "ViewController.h" #import ...
- gRPC源码分析1-SSL/TLS
引子 前几天看到微信后台团队分享了TLS相关文章,正好gRPC里TLS数据加密是很重要的一块,于是整理出了这篇文章. 在gRPC里,如果仅仅是用来做后端微服务,可以考虑不加密.本文太长,先给个大纲. ...
- CSS3中的动画效果记录
今天要记录的是CSS3中的三种属性transform.transition以及animation,这三个属性大大提升了css处理动画的能力. 一.Transform 变形 CSS中transform ...
- [Erlang 0122] Erlang Resources 2014年1月~6月资讯合集
虽然忙,有些事还是要抽时间做; Erlang Resources 小站 2014年1月~6月资讯合集,方便检索. 小站地址: http://site.douban.com/204209/ ...
- HTTPS协议机制
转载:http://www.ruanyifeng.com/blog/2014/02/ssl_tls.html 一.作用 不使用SSL/TLS的HTTP通信,就是不加密的通信.所有信息明文传播,带来了三 ...
随机推荐
- 《Effective C++》内存管理
如果global new-hander没有成功配置,会抛出一个std::bad_alloc的exception. #include<iostream> #include<new> ...
- 如何在jasperreport自动生成序号
在导出报表时,有时候我们需要显示序号,有两种方法: 1.就是再加一个字段,就是说将序号也当做是要导出的字段来处理,然后用程序给这个字段赋值,这方面有点傻,就不说了. 2.利用jasperreport提 ...
- 创建range分区
drop table T_PM_ACCT_DTL_AF_TEST; create table T_PM_ACCT_DTL_AF_TEST ( DATA_DATE date, AC ...
- java static 执行顺序
先加载类,然后再实例化类. 继承与static 面试题目如下:请写出程序执行完成之后的结果. package extend; public class X { Y y=new Y(); static{ ...
- 【转】Unity 相关经典博客资源总结(持续更新)
原文:http://blog.csdn.net/prothi/article/details/20123319 就作为一个记录吧,把平时看过的Unity相关的一些好的Blog记录并分享. 好的论坛: ...
- css背景图片位置:background的position
position的两个参数:水平方向的位置,垂直方向的位置----------该位置是指背景图片相对于前景对象的 1.background:url(../image/header.jpg) no-re ...
- Bzoj 3781: 小B的询问 莫队,分块,暴力
3781: 小B的询问 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 426 Solved: 284[Submit][Status][Discuss ...
- record
http://www.cnblogs.com/90zeng/p/python_translation.html http://www.cnblogs.com/netfocus/p/4478094.ht ...
- rnqoj-73-展演队型-dp
纯属于敢想就敢做的题目,列出来状态转移就OK了 #include<stdio.h> #include<string.h> #include<iostream> #i ...
- IntelliJ IDEA自用快捷键 转载
最常用快捷键- 未分类 command Binding Description defeat - Ctrl+/ 代码提示 No - Ctrl+Alt+L 格式化代码 - Ctrl+B 快速打开光标 ...