原文: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. Object-c学习之路五(@protocol协议)

    今天模拟Button的delegate来联系一下protocol. Button类 // Button.h // Protocal // // Created by WildCat on 13-7-2 ...

  2. JS树型菜单

    本树型菜单主要实现功能有:基本的树型菜单,可勾选进行多选项操作. 本树型菜单适合最初级的学者学习,涉及内容不难,下面看代码. 首先看View的代码,第一个<div>用来定义树显示的位置和i ...

  3. 修改List报ConcurrentModificationException异常原因分析

    使用迭代器遍历List的时候修改List报ConcurrentModificationException异常原因分析 在使用Iterator来迭代遍历List的时候如果修改该List对象,则会报jav ...

  4. 代码契约CodeContract(八)

    代码契约(Code Contract):它并不是语言本身的新功能,而是一些额外的工具,帮助人们控制代码边界. 代码契约之于C#,就相当于诗词歌赋之于语言. --- C# in Depth 一,概述 1 ...

  5. jQuery.fn.attr与jQuery.fn.prop

    jQuery.fn.attr与jQuery.fn.prop jQuery.fn.attr.jQuery.fn.prop的区别 假设页面有下面这么个标签,$('#ddd').attr('nick').$ ...

  6. 先对数组排序,在进行折半查找(C++)

    第一步:输入15个整数 第二步:对这15个数进行排序 第三部:输入一个数,在后在排好序的数中进行折半查找,判断该数的位置 实现代码如下: 方法一: 选择排序法+循环折半查找法 #include< ...

  7. Study notes for Discrete Probability Distribution

    The Basics of Probability Probability measures the amount of uncertainty of an event: a fact whose o ...

  8. [置顶] Oracle学习经验谈

    经常遇到朋友问oracle学习难不难,怎么才能成为高手等等,我想结合我的个人经验简单说几点: 1.打好基础,由浅入深 学习Oracle不能急于求成,寄希望于一天成为一个大侠.学习有个过程,应该由浅入深 ...

  9. 项目在JDK1.8环境下的一个Bug

    今天发现一个已有的项目在JDK1.8环境下运行时,会报错: The type java.util.Map$Entry cannot be resolved. It is indirectly refr ...

  10. MySQL索引类型

    一.简介 MySQL目前主要有以下几种索引类型:1.普通索引2.唯一索引3.主键索引4.组合索引5.全文索引 二.语句 CREATE TABLE table_name[col_name data ty ...