在利用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;

说明:

  1. isa:须要注意的是在Objective-C中。全部的类自身也是一个对象。这个对象的Class里面也有一个isa指针,它指向metaClass(元类),我们会在后面介绍它。
  2. super_class:指向该类的父类。假设该类已经是最顶层的根类(如NSObject或NSProxy),则super_class为NULL。
  3. cache:用于缓存近期使用的方法。一个接收者对象接收到一个消息时。它会依据isa指针去查找可以响应这个消息的对象。在实际使用中,这个对象仅仅有一部分方法是经常使用的,非常多方法事实上非常少用或者根本用不上。这样的情况下,假设每次消息来时,我们都是methodLists中遍历一遍,性能势必非常差。这时。cache就派上用场了。

    在我们每次调用过一个方法后。这种方法就会被缓存到cache列表中,下次调用的时候runtime就会优先去cache中查找。假设cache没有,才去methodLists中查找方法。这样,对于那些经经常使用到的方法的调用,但提高了调用的效率。

  4. version:我们能够使用这个字段来提供类的版本号信息。这对于对象的序列化很实用,它但是让我们识别出不同类定义版本号中实例变量布局的改变。

以下以array对象为例来说明其运行过程:

  1. [NSArray alloc]先被运行。

    由于NSArray没有+alloc方法,于是去父类NSObject去查找。

  2. 检測NSObject是否响应+alloc方法,发现响应。于是检測NSArray类,并依据其所需的内存空间大小開始分配内存空间,然后把isa指针指向NSArray类。同一时候,+alloc也被加进cache方法列表里面。
  3. 接着。运行-init方法,假设NSArray响应该方法。则直接将其增加cache方法列表。假设不响应,则去父类查找。
  4. 在后期的操作中,假设再以[[NSArray alloc] init]这样的方式来创建数组,则会直接从cache方法列表中取出对应的方法,直接调用。

最新文章

  1. C#多线程之线程同步篇3
  2. 邻接矩阵的深度优先遍历(java版)
  3. 关于SQL储存过程中输出多行数据
  4. Java中的数是用补码表示的检验
  5. DBCP连接池配置参数说明
  6. 战斗住的DPS才是DPS,持续的执行力才是执行力
  7. Windows事件ID大全
  8. Nopi .net下面的Excel第三方dll
  9. Android : 如何在WebView显示的页面中查找内容
  10. ThinkPHP - CURD增删改查 - 实例
  11. Java 内存模型- Java Memory Model
  12. Css雪碧图
  13. Python3 标准库概览
  14. html2canvas截屏在H5微信移动端踩坑,ios和安卓均可显示
  15. linux中shell变量$#,$@,$0,$1,$2的含义解释 (转载)
  16. Spring 入门知识点笔记整理
  17. Memcached+WebApi记录
  18. [算法总结] 6 道题搞定 BAT 面试——堆栈和队列
  19. JSON转换的原创工具类
  20. 三、Mosquitto Java 客户端实现

热门文章

  1. Session 转台服务器的使用方法
  2. loadrunner参数化总结
  3. 前端面试题整理(html)
  4. C++内存管理(超长)
  5. 在webform中调用JS的技巧
  6. 性能测试之LoardRunner 手动关联一
  7. Android程序检测网络是否可用
  8. SGU114-Telecasting station
  9. Python Base64转码解码
  10. 网页插入QQ 无需加好友