Objective-C 源码(一):对象模型

首先,你要先弄清楚什么是类,什么是对象。(为了说清楚这个问题,先举个栗子:类—>对象—>实例:人类是类;某个人是对象;你是实例;实例本身也是对象。这下基本能理解其中的差别了,要是还是搞不清楚,自己去google一下吧。)

对象

在Objective-C中,每一个对象都是某个类的实例,且这个对象的isa指针指向它所属的类。打开 objc-private.h文件,在第126行可以看到 Objective-C???? 对象的定义struct objc_object ,Objective-C中对象本质上是结构体对象,其中isa是它的唯一私有变量。

同样的,在第48行到第52行,可以找到 Class 和 id 类型定义,这也是为什么 id类型可以指向任意对象的原因。其中objc_class 就是 Objective-C 中类的定义。

对象的类不仅描述了对象的数据:对象占用内存大小,成员变量的类型布局等,还描述了对象的行为:对象能响应的信息,实现的实力方法(很多对runtime的讲解的文章,其实就是在这一块做文章)等。因此,当我们调用[receiver message]给一个对象发送消息的时候,这个对象能否响应这个消息就需要通过isa找到它所属的类(包括superClass)才能知道。

打开 objc-runtime-new.h ,在687行可以找到 Objective-C 中 struct objc_class 的定义。可以看到Objective-C中类也是一个结构体对象,并且继承了 struct objc_object 。

所以: Objective-C 中的类本质上也是对象,我们称之为类对象。按照之前说的,所有的对象都是某个类的实例,那么类对象又是什么什么类的实例,这是个值得思考的问题。

我们知道 Objective-C 中有一个非常特殊的NSObject,绝大部分的类都继承自它,它是 Objective-C 中两个rootClass钟的一个,另一个是NSProxy(另一篇文章有)。打开 NSObject.h ,可以看到NSObject 类就只有一个成员变量 isa, 所有继承自NSObject得类也都会有这个成员变量。

元类

本质上讲, Objective-C 中的类也是对象,它也是某个类的实例,这个类我们称之为元类(metaclass)。

因此,我们可以调用类方法,比如[NSObject new]来给类对象发送消息。同样的,类对象能否响应这个消息,要通过isa找到类对象所属的类(元类)才能知道。也就是说,实例方法保存在类中,而类方法保存在元类中。

元类也是对象(元类对象),元类也是某个类的实例,这个类我们称之为根元类(root metaclass)。特殊的是:所有的元类所属的类都是同一个根元类(当然根元类也是元类,所以它所属的类也是根元类,即它本身)。根元类所指的就是根类的元类,具体说就是根类NSObject 对应的元类。

上经典图:通过上面的解析,再来看这张图,清晰多了。

时间: 2024-08-10 00:06:39

Objective-C 源码(一):对象模型的相关文章

Objective-C 源码(零):前戏

趁着最近比较闲,可以再次研究一下Objective-C的源代码,顺便梳理一下思路,愿有更大收获. Objective-C是一门面向对象的程序设计语言.它的对象模型是基于类来创立的.源码可以在苹果开源的runtime中下载,连接是http://opensource.apple.com/tarballs/objc4/ ,自己下载了个objc4-647.tar.gz 版本. 看源码能学到很多东西,特别是runtime原理,如果想学好,但是又懒的自己看源码,只是局限于看大神的博客里面的一些他们看完源码之

C++ TinyXml操作(含源码下载)

前言 TinyXML是一个开源的解析XML的解析库,能够用于C++,能够在Windows或Linux中编译,使用TinyXML进行C++ XML解析,使用简单,容易上手.这个解析库的模型通过解析XML文件,然后在内存中生成DOM模型,从而让我们很方便的遍历这棵XML树. DOM模型即文档对象模型,是将整个文档分成多个元素(如书.章.节.段等),并利用树型结构表示这些元素之间的顺序关系以及嵌套包含关系. TinyXML介绍 在TinyXML中,根据XML的各种元素来定义了一些类:TiXmlBase

Backbone.js源码分析(珍藏版)

源码分析珍藏,方便下次阅读! // Backbone.js 0.9.2 // (c) 2010-2012 Jeremy Ashkenas, DocumentCloud Inc. // Backbone may be freely distributed under the MIT license. // For all details and documentation: // http://backbonejs.org (function () { // 创建一个全局对象, 在浏览器中表示为w

MyBatis 源码分析——配置信息

MyBatis框架的启动前期需要加载相关的XML配置信息.从官网上我们可以了解到他具有十几个节点.其中笔者认为比较重要的节点是settings节点.properties节点.environments节点. transactionManager节点.至于相关的作用到官网看过一篇都会明白. MyBatis框架的XML配置到底有几个节点,这个必须去查看一下相关的DTD文件才行.DTA文件就在包名为org.apache.ibatis.builder.xml的下面.由于显示的问题笔者只复制出部分来. <?

&lt;Linux内核源码&gt;内存管理模型

题外语:本人对linux内核的了解尚浅,如果有差池欢迎指正,也欢迎提问交流! 首先要理解一下每一个进程是如何维护自己独立的寻址空间的,我的电脑里呢是8G内存空间.了解过的朋友应该都知道这是虚拟内存技术解决的这个问题,然而再linux中具体是怎样的模型解决的操作系统的这个设计需求的呢,让我们从linux源码的片段开始看吧!(以下内核源码均来自fedora21 64位系统的fc-3.19.3版本内核) <include/linux/mm_type.h>中对于物理页面的定义struct page,也

Backbone.js 0.9.2 源码分析收藏

Backbone 为复杂Javascript应用程序提供模型(models).集合(collections).视图(views)的结构.其中模型用于绑定键值数据和自定义事件:集合附有可枚举函数的丰富API: 视图可以声明事件处理函数,并通过RESRful JSON接口连接到应用程序. 源码分析转之网上它人的备注,特收藏一下,以免方便阅读. // Backbone.js 0.9.2 // (c) 2010-2012 Jeremy Ashkenas, DocumentCloud Inc. // Ba

10个web前端jQuery开发者必备的源码组件

1.Conditioniz – 探测浏览器并条件加载 JavaScript 和 CSS Conditioniz 是一个快速.轻量级(3KB)的 JavaScript 工具,用于探测浏览器和分辨率并条件加载 JavaScript 和 CSS 文件.Conditioniz 从它的 jQuery 前身重建,现在速度要快50%.结合类名添加和 Conditionizr 集成的脚本和样式加载功能,允许你为不同的浏览器指定想加载的脚本和样式.浏览器嗅探通常被认为是不可靠的,Conditionizr 的建立就

基于源码编译安装openssh

 最近的,openssl/openssh等相继漏洞的暴露,让暴露在公网的linux.沦陷为肉鸡的正营... 没办法,还是升级版本... 00.openssh简介 OpenSSH 是一组安全远程的连接工具,主要包括了几个部份:ssh.sshd.scp.sftp.ssh-keygen.ssh-agent.ssh-add等 ssh(SSH 客户端,用于登录建立连接,是 rlogin 与 Telnet的安全替代方案)sshd (SSH 服务端,典型的独立守护进程)scp.sftp (文件安全传输工具,r

Spring 源码学习(一)

设计伊始       Spring 是为解决企业级应用开发的复杂性而设计,她可以做很多事.但归根到底支撑Spring的仅仅是少许的基本理念,而所有地这些的基本理念都能可以追溯到一个最根本的使命:简化开发.这是一个郑重的承诺,其实许多框架都声称在某些方面做了简化. 而Spring则立志于全方面的简化Java开发.对此,她主要采取了4个关键策略: 1,基于POJO的轻量级和最小侵入性编程: 2,通过依赖注入和面向接口松耦合: 3,基于切面和惯性进行声明式编程: 4,通过切面和模板减少样板式代码: 而

ReactNative 4Android源码分析二: 《JNI智能指针之实现篇》

文/Tamic http://blog.csdn.net/sk719887916/article/details/53462268 回顾 上一篇介绍了<ReactNative4Android源码分析2: JNI智能指针之介绍篇>JNI智能指针与wrapper class的作用,下面将对它们的具体实现进行分析,并解答上篇提出的几个问题 前文回顾了java object在JNI中的引用对象jobject的3种类型.智能指针自然也有相应的如下类型: global_ref 全局指针与jobject全局