iOS-OC对象模型
原文: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的类,这个类中有成员变量和成员函数和类函数,之后来看它的运行时内存状态。
头文件:
- #import <Foundation/Foundation.h>
- @interface SubclassTest : NSObject
- //成员变量的声明
- @property (nonatomic,retain)NSString *attrOne;
- @property (nonatomic,retain)NSString *attrTwo;
- @property (nonatomic,retain)NSString *attrThree;
- //成员函数的声明
- -(void)instanceMethodOne;
- -(void)instanceMethodTwo;
- -(void)instanceMethodThree;
- //类函数的声明
- +(void)classMethodOne;
- +(void)classMethodTwo;
- +(void)classMethodThree;
- @end
运行状态图:
当我们使用这样的一个句子SubclassTest *obj = [[SubclassTest alloc]init];内存状态如下:
小结 :
其中我们编程要关心的时SubclassTest的实例,其他的类对象和元类对象是语言运行时的支持对象。
我们在成员方法中使用的self是实例对象。
我们在类方法中使用的self是类对象,要注意区别它们的关系。
同的来说,OC最终也要编译成计算机CPU指令可以把它映射为数据块的参数传递,和服务函数的调用,至于函数的调用通过函数指针来实现,函数指针的如何调用如何存储如何组织,通过包装之后写成规范并实现其编译器,也就成为另一门新的计算机语言了。汇编通过包装称为C++,C++通过封装加运行时称为了OC,java,C#等计算机高级编译型语言,随着计算机的发展为来语言又会变成什么样了,如果编译器越来越智能,它能够通过我们的自然语言就能自动实现计算机CPU指令的生成,到哪个时候还要程序猿干嘛。。。。
iOS-OC对象模型的更多相关文章
- iOS - OC 面向对象语法
1.类 1)根类:因为类 NSObject 是层次结构的最顶层,因此称为根类. 可以将类称为子类(subclass)和父类(superclass),也可以将类称为子类和超类. 2)分类/类别(cate ...
- ios+oc面试题
ios+oc面试题 浅复制和深复制的区别?//浅拷贝和深拷贝答案:浅层复制(copy):只复制指向对象的指针,而不复制引用对象本身.//通过对象的指针来访问这个对象深层复制(mutableCo ...
- iOS OC语言原生开发的IM模块--RChat
iOS OC语言原生开发的IM模块,用于项目中需要原生开发IM的情况,具备发送文字.表情.语音.图片.视频等完整功能,包含图片预览视频播放等功能,此项目将会长期更新如有问题可以提出,我的邮箱:fshm ...
- iOS - OC RunTime 运行时
1.运行时的使用 向分类中添加属性 // 包含运行时头文件 #import <objc/runtime.h> /* void objc_setAssociatedObject(id obj ...
- iOS - OC Category 分类
1.Category 1)分类/类别(category): 允许以模块的方式向现有类定义添加新的方法(默认不能添加实例变量).用以扩展自己或他人以前实现的类,使它适合自己的需要. 分类的名称括在类名之 ...
- iOS - OC 语言新特性
前言 相对于 Java,OC 语言是一门古老的语言了,而它又是一门不断发展完善的语言.一些新的编译特性,为 OC 语言带来了许多新的活力.在 Xcode7 中,iOS9 的 SDK 已经全面兼容了 O ...
- iOS - OC NSKeyedArchiver 数据归档
前言 @interface NSKeyedArchiver : NSCoder @interface NSKeyedUnarchiver : NSCoder 在 OC 语言中,归档是一个过程,即用某种 ...
- iOS - OC Enum 枚举
前言 iOS 5.0 之后,提供了新的枚举定义方式,定义枚举的同时,可以指定枚举中数据的类型. typedef NS_OPTIONS(_type, _name) new; -> 位移的,可以使用 ...
- iOS - OC iOS 开发体系
1.iOS 开发技术体系 iOS 开发技术体系图: 层级 主要框架 Cocoa Touch UIKit 等 Media Core Graphics .OpenGl ES.Core Animation ...
随机推荐
- 广告频次控制(frequency capping)
频次控制介绍 广告中的频次控制是指控制一个用户最多在指定时间内看到一个广告(或相似广告)的次数,比如广告主可以限制一个用户最多只能一天看到一个广告3次(频次控制也可以让publisher来指定,但本文 ...
- UML九种图-包图、类图
UML九种图-包图.类图 一.包 (一)相关概念: 1.包: 一个包=一层=一个命名空间=一个文件夹 2.包的命名: 简单名:王老二 路径名:中国.河北省.廊坊市.廊坊师范学院.信息技术提高班.九期班 ...
- TCP/IP详解学习笔记- 概述
TCP/IP详解学习笔记(1)-- 概述1.TCP/IP的分层结构 网络协议通常分不同层次进行开发,每一层分别负责不同的同信功能.TCP/IP通常被认为是一个四层协议系统. 如图所 ...
- POJ 1654 Area
题意:从原点出发,沿着8个方向走,每次走1个点格或者根号2个点格的距离,最终回到原点,求围住的多边形面积. 分析:直接记录所经过的点,然后计算多边形面积.注意,不用先保存所有的点,然后计算面积,边走变 ...
- CentOS常用到的查看系统命令
CentOS常用到的查看系统命令 # uname -a # 查看内核/操作系统/CPU信息 # head -n 1 /etc/issue # 查看操作系统版本 # cat /proc/c ...
- JVM内存管理学习总结(一)
I.JVM进程的生命周期 JVM实例的生命周期和java程序的生命周期保持一致,即一个新的程序启动则产生一个新的JVM进程实例,程序结束则JVM进程实例伴随着消失.那么程序启动和程序终止就是JVM实例 ...
- vsftpd配置seccomp_sandbox=NO
在ubuntu14.04 配置vsftp时如果不加上seccomp_sandbox=NO这一句会出现莫名的530错误
- InnoDB的Named File Formats
随着InnoDB存储引擎的发展,新的页数据结构有时用来支持新的功能特性.比如前面提到的InnoDB Plugin,提供了新的页数据结构来支持表压缩功能,完全溢出的(Off page)大变长字符类型字段 ...
- Qt 富文本处理
富文本处理 所有的类围绕 QTextDocument 展开, 它保证了用户可以创建和修改 富文本块, 而无须定义中间语言.一个 QTextDocument 可以通过两个接口操作, 一个是用于编辑的 C ...
- scp命令报错(IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!)
使用scp命令移动某一服务器的文件到另外的服务器时报出一下错误: [root@bogon vm_sys1]# scp project.tar.gz root@172.31.0.90:/webdata/ ...