原文:http://blog.csdn.net/fanyiyao980404514/article/details/44864663

在C++的内存模型中我们知道,我们通过虚函数列表来存储虚函数的虚拟内存地址,再数据块中加入一个指向虚函数列表的指针变量,通过指针变量来得到虚函数列表,再通过虚函数列表来调用虚函数来实现多态的面向对象的编程功能。

既然OC是面向对象的高级计算机语言。它有一个语言运行时,我们可以动态的判断改实例变量是否拥有该函数。通过运行时来创建对应类的变量,通过运行时来添加成员变量和成员函数,通过运行时来复制实例变量。

开一下内存模型的运行状态图(来源网络)

isa指针变量就是is a .....这个指针变量指向的就是该变量的类信息,所有的类都是继承至NSObject基类。

instance of subclass:堆内存块存储的是用户设计时的成员变量和编译器给你添加的一些成员变量,添加的这些成员变量是用来支持运行时的。instance of subclass指向的它的类对象subclass object。

subclass是类对象,该对象中的信息是该类的成员函数的指针地址列表,它有指向该类的元类对象subclass(meta)。

元类对象subclass(meta)这也是系统创建的用来支持语言运行时,该类的中存储的是该子类的类函数的指针地址列表,通过改列表来调用该类的类函数。

子类的最终指向都是NSObject的类对象和和元类对象,类对象指向父类的类对象,元类对象指向父类的元类对象,NSObject的类对象指向nil,这就能说明nil掉用任何方法都不会抱错的原因了。

下面我们来声明一个OC的类,这个类中有成员变量和成员函数和类函数,之后来看它的运行时内存状态。

头文件:

  1. #import <Foundation/Foundation.h>
  2. @interface SubclassTest : NSObject
  3. //成员变量的声明
  4. @property (nonatomic,retain)NSString *attrOne;
  5. @property (nonatomic,retain)NSString *attrTwo;
  6. @property (nonatomic,retain)NSString *attrThree;
  7. //成员函数的声明
  8. -(void)instanceMethodOne;
  9. -(void)instanceMethodTwo;
  10. -(void)instanceMethodThree;
  11. //类函数的声明
  12. +(void)classMethodOne;
  13. +(void)classMethodTwo;
  14. +(void)classMethodThree;
  15. @end

运行状态图:

当我们使用这样的一个句子SubclassTest *obj = [[SubclassTest alloc]init];内存状态如下:

小结 :

其中我们编程要关心的时SubclassTest的实例,其他的类对象和元类对象是语言运行时的支持对象。

我们在成员方法中使用的self是实例对象。

我们在类方法中使用的self是类对象,要注意区别它们的关系。

同的来说,OC最终也要编译成计算机CPU指令可以把它映射为数据块的参数传递,和服务函数的调用,至于函数的调用通过函数指针来实现,函数指针的如何调用如何存储如何组织,通过包装之后写成规范并实现其编译器,也就成为另一门新的计算机语言了。汇编通过包装称为C++,C++通过封装加运行时称为了OC,java,C#等计算机高级编译型语言,随着计算机的发展为来语言又会变成什么样了,如果编译器越来越智能,它能够通过我们的自然语言就能自动实现计算机CPU指令的生成,到哪个时候还要程序猿干嘛。。。。

iOS-OC对象模型的更多相关文章

  1. iOS - OC 面向对象语法

    1.类 1)根类:因为类 NSObject 是层次结构的最顶层,因此称为根类. 可以将类称为子类(subclass)和父类(superclass),也可以将类称为子类和超类. 2)分类/类别(cate ...

  2. ios+oc面试题

    ios+oc面试题     浅复制和深复制的区别?//浅拷贝和深拷贝答案:浅层复制(copy):只复制指向对象的指针,而不复制引用对象本身.//通过对象的指针来访问这个对象深层复制(mutableCo ...

  3. iOS OC语言原生开发的IM模块--RChat

    iOS OC语言原生开发的IM模块,用于项目中需要原生开发IM的情况,具备发送文字.表情.语音.图片.视频等完整功能,包含图片预览视频播放等功能,此项目将会长期更新如有问题可以提出,我的邮箱:fshm ...

  4. iOS - OC RunTime 运行时

    1.运行时的使用 向分类中添加属性 // 包含运行时头文件 #import <objc/runtime.h> /* void objc_setAssociatedObject(id obj ...

  5. iOS - OC Category 分类

    1.Category 1)分类/类别(category): 允许以模块的方式向现有类定义添加新的方法(默认不能添加实例变量).用以扩展自己或他人以前实现的类,使它适合自己的需要. 分类的名称括在类名之 ...

  6. iOS - OC 语言新特性

    前言 相对于 Java,OC 语言是一门古老的语言了,而它又是一门不断发展完善的语言.一些新的编译特性,为 OC 语言带来了许多新的活力.在 Xcode7 中,iOS9 的 SDK 已经全面兼容了 O ...

  7. iOS - OC NSKeyedArchiver 数据归档

    前言 @interface NSKeyedArchiver : NSCoder @interface NSKeyedUnarchiver : NSCoder 在 OC 语言中,归档是一个过程,即用某种 ...

  8. iOS - OC Enum 枚举

    前言 iOS 5.0 之后,提供了新的枚举定义方式,定义枚举的同时,可以指定枚举中数据的类型. typedef NS_OPTIONS(_type, _name) new; -> 位移的,可以使用 ...

  9. iOS - OC iOS 开发体系

    1.iOS 开发技术体系 iOS 开发技术体系图: 层级 主要框架 Cocoa Touch UIKit 等 Media Core Graphics .OpenGl ES.Core Animation ...

随机推荐

  1. wxWidgets的安装编译、相关配置、问题分析处理

    wxWidgets的安装编译.相关配置.问题分析处理 一.介绍部分 (win7 下的 GUI 效果图见 本篇文章的最后部分截图2张) wxWidgets是一个开源的跨平台的C++构架库(framewo ...

  2. SL.XNA中的Popup

    如果要xna与sl混合显示,就不能用popup,不然会有各种显示错乱的问题.如果xna与sl单独显示,可以使用popup,但是要记得移除UIElementRenderer.就是说popup只能交给系统 ...

  3. JAVA小知识点-Finally和Return的执行关系

    如果Try和Catch中存在return语句的时候Finally内的语句是否会执行,执行的时候对结果又有什么影响呢?我写了个例子来试验这个问题: public static Map<String ...

  4. Python -- machine learning, neural network -- PyBrain 机器学习 神经网络

    I am using pybrain on my Linuxmint 13 x86_64 PC. As what it is described: PyBrain is a modular Machi ...

  5. boost解析XML方法教程

    boost库在解析XML时具有良好的性能,可操作性也很强下地址有个简单的说明 http://blog.csdn.net/luopeiyuan1990/article/details/9445691 一 ...

  6. Dubbo源码学习--注册中心分析

    相关文章: Dubbo源码学习--服务是如何发布的 Dubbo源码学习--服务是如何引用的 注册中心 关于注册中心,Dubbo提供了多个实现方式,有比较成熟的使用zookeeper 和 redis 的 ...

  7. .Net程序员学用Oracle系列(10):系统函数(下)

    <.Net程序员学用Oracle系列:导航目录> 本文大纲 1.转换函数 1.1.TO_CHAR 1.2.TO_NUMBER 1.3.TO_DATE 1.4.CAST 2.近似值函数 2. ...

  8. 结构-行为-样式-Js排序算法之 快速排序

    快速排序算法,是我的算法系列博客中的第二个Js实现的算法,主要思路:    在一个数组中随机取一个数(一般都取第一个或者最后一个),使这个数与数组中其他数进行比较,如果比它大就放到它的右边,比它小就放 ...

  9. TortoiseSVN历史版本安装及svn服务器搭建

    一.TortoiseSVN安装 1.TortoiseSVN下载 网址如下:https://tortoisesvn.net/downloads.html   进入客户端下载页面,根据你的电脑选择是64位 ...

  10. elasticsearch查询模板

    { "from":#from#, "size":#size#, "_source":#source#, "query": ...