认识Runtime1
认识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的更多相关文章
- “前.NET Core时代”如何实现跨平台代码重用 ——程序集重用
除了在源代码层面实现共享("前.NET Core时代"如何实现跨平台代码重用 --源文件重用)之外,我们还可以跨平台共享同一个程序集,这种独立于具体平台的"中性" ...
- Spring 3.x jar 包详解 与 依赖关系
以下的内容我会持续更新(当然是我有新发现的时候); 以下内容是我在网上搜索.整理.修改的而成的内容.由于很多内容都是转载了,无法追溯到源头,因此无法一一对原作者进行道谢. 这几天,我查阅大量的官方的文 ...
- Spring 3.x jar 包详解 与 依赖关系(转)
以下的内容我会持续更新(当然是我有新发现的时候); 以下内容是我在网上搜索.整理.修改的而成的内容.由于很多内容都是转载了,无法追溯到源头,因此无法一一对原作者进行道谢. 这几天,我查阅大量的官方的文 ...
- 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 ...
- LINQ To SQL在N层应用程序中的CUD操作、批量删除、批量更新
原文:LINQ To SQL在N层应用程序中的CUD操作.批量删除.批量更新 0. 说明 Linq to Sql,以下简称L2S. 以下文中所指的两层和三层结构,分别如下图所示: 准确的说,这里 ...
- python高级编程和算法
import copy #a = ("a","b","c") #a = ["a","b"," ...
- OpenShift应用镜像构建(2) - 链式构建
Openshift对于应用构建提供了三种模式 从应用的源代码构建并部署,Openshift通过一个S2I的构建过程编译打包并实现发布,具体可以参考 https://www.cnblogs.com/er ...
- LeetCode-1:Two Sum
[Problem:1-Two Sum] Given an array of integers, return indices of the two numbers such that they add ...
- 三分钟迁移Spring boot工程到Serverless
前言 Spring Boot已成为当今最流行的Java后端开发框架,典型的应用方式是在云上购买一台虚拟机,每天24小时在上面运行Java程序,在这种情况下,用户必须维护自己的虚拟机环境,而且按照包月包 ...
随机推荐
- MongoDB 安装记录
之前使用一直没记录,防再次掉坑,记录下 echo 开始 D: cd D:\Program Files\MongoDB\Server\3.2\bin mongod --install --service ...
- 禁用iPhone手机浏览器上给电话号码自动加上的link样式
iPhone手机上的浏览器(如Safari),在解析网页的时候会自动给 像是电话号码的数字 加上link样式. 可以添加下面的meta禁用掉这个功能. // //
- 谈mvc开发中gzip压缩的应用
压缩view的内容,可加过滤器 public class GzipFilter : ActionFilterAttribute { public override void O ...
- 使用MyXls,出现访问被拒绝情况
MyXls 作为一款比较好用的 操作Excel 的开源项目. 最近日常偶然发现报权限的问题,导出xls失败,处理方式以下: 如报上图所示错误,则需要在web.config中 <system.we ...
- webapp项目前端总结
提纲 整体把握,从设计稿入手——技术选型 并行开发,从实现静态页面开始 前端自动化 前端js逻辑 前后端集成 小问题集合 总结 1.整体把握,从设计稿入手 —— 技术选型 新项目到手,算是运气好,设计 ...
- 潮流设计:15个创意的 3D 字体版式作品欣赏
3D字体设计是真的很棒,它最适用于广告.使用3D文字和不同的惊人效果,例如灯光或纹理带来了很多东西.在版式设计中,最重要的是消息.如果它抓住了用户的注意力,设计工作是在正确的轨道上. 您可能感兴趣的相 ...
- 小printf的故事(未完待续)
小printf的故事 这篇文章的原文来自:英文原文作者仿照<小王子>中的情节,生动有趣的阐述了小printf从编程小白到专家的成长历程.这是我第一次尝试翻译文章,肯定有很多不足之处,情不要 ...
- BZOJ1003 物流运输 最短路+DP
1003: [ZJOI2006]物流运输 Description 物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要n天才能运完.货物运输过程中一般要转停好几个码头.物流公司通常会设计一条 ...
- 通过Foxit和坚果云实现iPad和PC的pdf同步阅读(修改,笔记)
这是解决我之后上班地铁上看书问题的一个关键部分 一个手持电子设备,不大不小 一个方便做笔记的笔 一个方便做笔记的阅读器软件 方便快速地同步(只同步标记最好了) 在查看很多建议以及自己尝试之后,总结了这 ...
- mysql主从复制显示正常,数据没同步现象。
当时在一个服务器上开启了多实例,主从复制结构图如下: 当时在192.168.10.3的服务器上用show slave status;显示的是正常的复制的,两个线程都为yes,并且读与写的pos也一直在 ...