认识Runtime1

什么是id?

id在objc.h中的定义如下:

typedef struct objc_object *id;

那么什么是objc_object呢?

objc_object在objc.h中的定义如下:

struct objc_object {
Class isa;
}

这个时候我们知道Objective-C中的object最后被转化成了C的结构体,而在这个struct种只有一个isa指针,指向它的类别Class.

那么什么是Class 呢?

在objc.h中定义如下:

typedef struct objc_class *Class;

我们可以看懂Class本身指向的也是一个C的struct objc_class.

我们看一下runtime.h中objc_class的定义如下:

struct objc_class {
Class isa OBJC_ISA_AVAILABILITY,
#if !_OBJC@_
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指向类的本身
  • cache:用于缓存最近使用的方法。一个接收者对象接收到一个消息时,它会根据isa指针去查找能够响应这个消息的对象。实际中,对象只有一部分方法是常用的,很多方法其实根本不用。这样,如果每次消息来时,我们都是在methodLists中遍历一遍,性能肯定会很差。这时cache就盼上用场了。每次调用过一个方法之后,这个方法就会被缓存到cache列表中,下次调用的时候runtime就会优先去cache中查找,如果没有才去methodLists中查找方法,这样对于经常用到的方法的调用,提高了调用效率。

在OC中,一切都是对象,Class在设计的本身也是一个对象。而这个Class对象对应的类,我们叫他Meta Class.即Class结构体中的isa指向就是他的元类。

Meta Class

我们可以把Meta Class理解为一个Class对象的Class.简单的说:

  • 当我们发送一个消息给一个NSObject对象时,这条信息会在对象的类方法列表里面查找。
  • 当我们发送一个消息给一个类时,这条消息会在Meta Class的方法列表里查找。

附:

参考自:

认识Runtime1的更多相关文章

  1. “前.NET Core时代”如何实现跨平台代码重用 ——程序集重用

    除了在源代码层面实现共享("前.NET Core时代"如何实现跨平台代码重用 --源文件重用)之外,我们还可以跨平台共享同一个程序集,这种独立于具体平台的"中性" ...

  2. Spring 3.x jar 包详解 与 依赖关系

    以下的内容我会持续更新(当然是我有新发现的时候); 以下内容是我在网上搜索.整理.修改的而成的内容.由于很多内容都是转载了,无法追溯到源头,因此无法一一对原作者进行道谢. 这几天,我查阅大量的官方的文 ...

  3. Spring 3.x jar 包详解 与 依赖关系(转)

    以下的内容我会持续更新(当然是我有新发现的时候); 以下内容是我在网上搜索.整理.修改的而成的内容.由于很多内容都是转载了,无法追溯到源头,因此无法一一对原作者进行道谢. 这几天,我查阅大量的官方的文 ...

  4. Android内存管理(1)WRANGLING DALVIK: MEMORY MANAGEMENT IN ANDROID PART 1

    from : http://www.raizlabs.com/dev/2014/03/wrangling-dalvik-memory-management-in-android-part-1-of-2 ...

  5. LINQ To SQL在N层应用程序中的CUD操作、批量删除、批量更新

    原文:LINQ To SQL在N层应用程序中的CUD操作.批量删除.批量更新 0. 说明 Linq to Sql,以下简称L2S.    以下文中所指的两层和三层结构,分别如下图所示: 准确的说,这里 ...

  6. python高级编程和算法

    import copy #a = ("a","b","c") #a = ["a","b"," ...

  7. OpenShift应用镜像构建(2) - 链式构建

    Openshift对于应用构建提供了三种模式 从应用的源代码构建并部署,Openshift通过一个S2I的构建过程编译打包并实现发布,具体可以参考 https://www.cnblogs.com/er ...

  8. LeetCode-1:Two Sum

    [Problem:1-Two Sum] Given an array of integers, return indices of the two numbers such that they add ...

  9. 三分钟迁移Spring boot工程到Serverless

    前言 Spring Boot已成为当今最流行的Java后端开发框架,典型的应用方式是在云上购买一台虚拟机,每天24小时在上面运行Java程序,在这种情况下,用户必须维护自己的虚拟机环境,而且按照包月包 ...

随机推荐

  1. MongoDB 安装记录

    之前使用一直没记录,防再次掉坑,记录下 echo 开始 D: cd D:\Program Files\MongoDB\Server\3.2\bin mongod --install --service ...

  2. 禁用iPhone手机浏览器上给电话号码自动加上的link样式

    iPhone手机上的浏览器(如Safari),在解析网页的时候会自动给 像是电话号码的数字 加上link样式. 可以添加下面的meta禁用掉这个功能. // //

  3. 谈mvc开发中gzip压缩的应用

    压缩view的内容,可加过滤器 public class GzipFilter : ActionFilterAttribute     {         public override void O ...

  4. 使用MyXls,出现访问被拒绝情况

    MyXls 作为一款比较好用的 操作Excel 的开源项目. 最近日常偶然发现报权限的问题,导出xls失败,处理方式以下: 如报上图所示错误,则需要在web.config中 <system.we ...

  5. webapp项目前端总结

    提纲 整体把握,从设计稿入手——技术选型 并行开发,从实现静态页面开始 前端自动化 前端js逻辑 前后端集成 小问题集合 总结 1.整体把握,从设计稿入手 —— 技术选型 新项目到手,算是运气好,设计 ...

  6. 潮流设计:15个创意的 3D 字体版式作品欣赏

    3D字体设计是真的很棒,它最适用于广告.使用3D文字和不同的惊人效果,例如灯光或纹理带来了很多东西.在版式设计中,最重要的是消息.如果它抓住了用户的注意力,设计工作是在正确的轨道上. 您可能感兴趣的相 ...

  7. 小printf的故事(未完待续)

    小printf的故事 这篇文章的原文来自:英文原文作者仿照<小王子>中的情节,生动有趣的阐述了小printf从编程小白到专家的成长历程.这是我第一次尝试翻译文章,肯定有很多不足之处,情不要 ...

  8. BZOJ1003 物流运输 最短路+DP

    1003: [ZJOI2006]物流运输 Description 物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要n天才能运完.货物运输过程中一般要转停好几个码头.物流公司通常会设计一条 ...

  9. 通过Foxit和坚果云实现iPad和PC的pdf同步阅读(修改,笔记)

    这是解决我之后上班地铁上看书问题的一个关键部分 一个手持电子设备,不大不小 一个方便做笔记的笔 一个方便做笔记的阅读器软件 方便快速地同步(只同步标记最好了) 在查看很多建议以及自己尝试之后,总结了这 ...

  10. mysql主从复制显示正常,数据没同步现象。

    当时在一个服务器上开启了多实例,主从复制结构图如下: 当时在192.168.10.3的服务器上用show slave status;显示的是正常的复制的,两个线程都为yes,并且读与写的pos也一直在 ...