OC对象创建过程
在利用OC开发应用程序中,须要大量创建对象,那么它的过程是什么呢?
比方:NSArray *array = [[NSArrayalloc]
init];
在说明之前,先把OC的Class描写叙述一下:
Class
Objective-C类是由Class类型来表示的,它实际上是一个指向objc_class结构体的指针。它的定义例如以下:
typedef struct objc_class *Class;
查看objc/runtime.h中objc_class结构体的定义例如以下:
struct objc_class {
Class isa;
#if !__OBJC2__
Class super_class OBJC2_UNAVAILABLE; // 父类
const char *name OBJC2_UNAVAILABLE; // 类名
long version OBJC2_UNAVAILABLE; // 类的版本号信息。默觉得0
long info OBJC2_UNAVAILABLE; // 类信息,供执行期使用的一些位标识
long instance_size OBJC2_UNAVAILABLE; // 该类的实例变量大小
struct objc_ivar_list *ivars OBJC2_UNAVAILABLE; // 该类的成员变量链表
struct objc_method_list **methodLists OBJC2_UNAVAILABLE; // 方法定义的链表
struct objc_cache *cache OBJC2_UNAVAILABLE; // 方法缓存
struct objc_protocol_list *protocols OBJC2_UNAVAILABLE; // 协议链表
#endif
} OBJC2_UNAVAILABLE;
说明:
- isa:须要注意的是在Objective-C中。全部的类自身也是一个对象。这个对象的Class里面也有一个isa指针,它指向metaClass(元类),我们会在后面介绍它。
- super_class:指向该类的父类。假设该类已经是最顶层的根类(如NSObject或NSProxy),则super_class为NULL。
- cache:用于缓存近期使用的方法。一个接收者对象接收到一个消息时。它会依据isa指针去查找可以响应这个消息的对象。在实际使用中,这个对象仅仅有一部分方法是经常使用的,非常多方法事实上非常少用或者根本用不上。这样的情况下,假设每次消息来时,我们都是methodLists中遍历一遍,性能势必非常差。这时。cache就派上用场了。
在我们每次调用过一个方法后。这种方法就会被缓存到cache列表中,下次调用的时候runtime就会优先去cache中查找。假设cache没有,才去methodLists中查找方法。这样,对于那些经经常使用到的方法的调用,但提高了调用的效率。
- version:我们能够使用这个字段来提供类的版本号信息。这对于对象的序列化很实用,它但是让我们识别出不同类定义版本号中实例变量布局的改变。
以下以array对象为例来说明其运行过程:
- [NSArray alloc]先被运行。
由于NSArray没有+alloc方法,于是去父类NSObject去查找。
- 检測NSObject是否响应+alloc方法,发现响应。于是检測NSArray类,并依据其所需的内存空间大小開始分配内存空间,然后把isa指针指向NSArray类。同一时候,+alloc也被加进cache方法列表里面。
- 接着。运行-init方法,假设NSArray响应该方法。则直接将其增加cache方法列表。假设不响应,则去父类查找。
- 在后期的操作中,假设再以[[NSArray alloc] init]这样的方式来创建数组,则会直接从cache方法列表中取出对应的方法,直接调用。
OC对象创建过程的更多相关文章
- Java中对象创建过程
本文介绍的对象创建过程仅限于普通Java对象,不包括数组和Class对象. 1.类加载检查 虚拟机遇到一条new指令时,首先去检查该指令的参数能否在常量池中定位到一个类的符号引用,并且检查这个符号引用 ...
- Java中类加载过程和对象创建过程
类加载过程: 1, JVM会先去方法区中找有没有相应类的.class存在.如果有,就直接使用:如果没有,则把相关类的.class加载到方法区 2, 在.class加载到方法区时,会分为两部分加载:先加 ...
- java基础---类加载和对象创建过程
类中可以存在的成员: class A{ 静态成员变量: 非静态成员变量: 静态函数: 非静态函数: 构造函数 A(..){...} 静态代码块 static{...} 构造代码块 {...} } 类加 ...
- COM对象创建过程
在客户端需要调用COM组件时,通常调用windowAPI函数: STDAPI CoCreateInstance( REFCLSID rclsid, //创建的Com对象的类标识符(CLSID) LPU ...
- java类加载、对象创建过程
类加载过程: 1, JVM会先去方法区中找有没有相应类的.class存在.如果有,就直接使用:如果没有,则把相关类的.class加载到方法区 2, 在.class加载到方法区时,会分为两部分加载:先加 ...
- JBPM TaskInstance 对象创建过程
对象获得过程如下: 获得对象工厂--->工厂创建代理对象 TaskMgmtInstance tmi = executionContext.getTaskMgmtInstance(); TaskI ...
- Java内存区域与对象创建过程
一.java内存区域 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有的区域则 ...
- 【原创】Python 对象创建过程中元类, __new__, __call__, __init__ 的处理
原始type: type是最原始的元类,其__call__方法是在你使用" t_class = type(classname_string, base_classes_tuple, attr ...
- 通过ORM模型看python对象创建过程
简易django ORM模型如下所示: #!/usr/bin/env python # encoding: utf-8 """ @version: 1.0 @author ...
随机推荐
- 【iOS开发-72】设置状态栏的两种方式、程序生命周期以及更好地理解几大类(对象)之间的关系
(1)设置状态栏的2种方式 --第一种方式就是我们在控制器中设置,系统默认就是交给视图控制器去管理的,这样不同视图控制器能够自己定义不同的状态栏例如以下: -(BOOL)prefersStatusBa ...
- GoldenGate配置(二)之双向复制配置
GoldenGate配置(二)之双向复制配置 环境: Item Source System Target System Platform Red Hat Enterprise Linux Serve ...
- lua语法 - 基础篇
1. 注释 单行注释:--,类似于C++的// 多行注释:--[[ ... ]],类似于C++的/*...*/ 2. 语句 分隔符:分号或者空格,一般多行写一起,建议用分号 语句块:do ... en ...
- USACO inflate
全然背包,转化为0/1背包 dp[i, j] = max(dp[i-1, j], dp[i, j - minutes[i]] + points[i]) /* ID:kevin_s1 PROG:infl ...
- KMP算法 KMP模式匹配 一(串)
A - KMP模式匹配 一(串) Crawling in process... Crawling failed Time Limit:1000MS Memory Limit:131072KB ...
- poj 百练 2765 八进制小数(精度问题)
2765:八进制小数 查看 提交 统计 提示 提问 总时间限制: 1000ms 内存限制: 65536kB 描写叙述 八进制小数能够用十进制小数精确的表示.比方,八进制里面的0.75等于十进制里 ...
- CLR和.Net对象
CLR和.Net对象生存周期 前言 1. 基础概念明晰* 1.1 公告语言运行时* 1.2 托管模块* 1.3 对象和类型* 1.4 垃圾回收器 2. 垃圾回收模型* 2.1 为什么需要垃圾回收* 2 ...
- Winfrom设置DataGridView单元格获得焦点(DataGridView - CurrentCell)
设置DataGridView单元格获得焦点 this.dgv_prescription.BeginEdit(true);
- 后台调用外部程序的完美实现(使用CreateDesktop建立隐藏桌面)
最近在做的一个软件,其中有一部分功能需要调用其它的软件来完成,而那个软件只有可执行文件,根本没有源代码,幸好,我要做的事不难,只需要在我的程序启动后,将那个软件打开,在需要的时候,对其中的一个文本矿设 ...
- session对象和applicatione对象
ASP.NET 的常用对象有:response对象.request对象.application对象.server对象.session对象.下面主要讨论session对象和cookie对象. sessi ...