原文: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. Attempted to lock an already-locked dir异常解决方法

    有时候因网络太慢或中断 就会出现这种锁定状态 Attempted to lock an already-locked dir svn: Working copy 'D:\MyEclipse\mypro ...

  2. 框架的设计之IRepository还是IRepository<T>

    [Yom框架]漫谈个人框架的设计之[是IRepository还是IRepository<T>]? 前言                                            ...

  3. ibatis配置log4j输出sql日志信息

    为了在开发过程更加直观,我们需要将ibatis日志打开以便观察ibatis运作的细节. ibatis采用Apache common_logging,并结合Apache log4j作为日志输出组件. 在 ...

  4. EasyNet.Solr 4.4.0发布及例子

    EasyNet.Solr 4.4.0发布及例子 EasyNet.Solr 4.4.0已经发布,可以直接从http://easynet.codeplex.com/ 下载试用并反馈.最新版本进行了以下改动 ...

  5. C++利用不完全实例化来获得函数模板参数的返回值和参数

    有一些模板会以函数为模板参数,有时候这些模板要获得函数的返回值和参数.如在boost中的signal和slot机制,就存在这样情况. 那么,我们如何得到这些信息呢? 我们使用C++不完全实例化来实现. ...

  6. [Python]根据地址从maps文件中找相应的库名

    /proc/PID/maps提供了进程的memory layout,下面脚本根据给定地址找出相应的库名: #!/usr/bin/python from __future__ import print_ ...

  7. redis beforesleep

    本来想把redis main函数附带都读完再写笔记,但实在太大了,所以现在决定一部分一部分地记录. eventloop中在每次进入循环时都会调用beforeSleep回调(因为processevent ...

  8. FTP之虚拟用户

    基于虚拟用户访问ftp关闭防火墙,selinux 过程如下1.装包,配置.起服务配置过程如下: 需写入vsftpd.conf配置文件中的内容如下: anonymous_enable=NO ---- 匿 ...

  9. SSH三大框架的基本整合以及常见错误的解决方法

    一.新建项目 eclipse->file->new->other->Dynamic Web Project,project name为sshDemo 二.下载jar包 1.st ...

  10. Xamarin原生跨平台概述(精简概述,命中要害。PS:无图)

    Xamarin原生跨平台:原生界面.原生性能.原生API(与H5比较): 1.C#可以访问Andrid.IOS原生API,也可以调用C#系统类型,如Syetem,System.IO;2.原理:基于Mo ...