OC Runtime
OC 是面向运行时的语言。Runtime就是系统在运行的时候的一些机制,其中最主要的是消息发送机制。OC语言与其他语言(如C语言)在函数(方法)的调用有很大的不同。C语言,函数的调用在编译的时候就已经决定调用哪个函数,编译完成之后直接顺序执行。而对于OC言,方法的调用则不然,在编译的时候不决定调用哪个方法。因为OC的方法调用是消息发送,属于动态调用过程,只有在真正运行的时候才会根据方法的名称找到对应的方法来调用。
OC是怎么实现动态调用的呢?
[obj start];
obj是对象,start是方法名。在编译时Runtime会将上述的代码转化为:
objc_msgSend(obj,@selector(start));
OC中所有的对象都继承于NSObject
@interface NSObject <NSObject> {
Class isa OBJC_ISA_AVAILABILITY;
}
在NSObject中存在一个Class的isa指针。下面介绍这个Class:
struct objc_class {
Class isa OBJC_ISA_AVAILABILITY;//指向metaclass #if !__OBJC2__
Class super_class OBJC2_UNAVAILABLE;//指向其父类
const char *name OBJC2_UNAVAILABLE;//类名
long version OBJC2_UNAVAILABLE;//版本号
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;
/* Use `Class` instead of `struct objc_class *` */
下面我们看一下方法是如何调用的:
首先,编译器将代码[obj start];转化为objc_msgSend(obj, @selector (start));,在objc_msgSend方法中。首先通过obj的isa指针找到obj对应的class。在Class中先去cache中 通过SEL查找对应方法method(猜测cache中method列表是以SEL为key通过hash表来存储的,这样能提高方法查找速度),若 cache中未找到。再去methodList中查找,若methodlist中未找到,则取superClass中查找。若能找到,则将method加 入到cache中,以方便下次查找,并通过method中的函数指针跳转到对应的方法中去执行。
OC Runtime的更多相关文章
- OC - runtime 之关联对象
header{font-size:1em;padding-top:1.5em;padding-bottom:1.5em} .markdown-body{overflow:hidden} .markdo ...
- iOS - OC RunTime 运行时
1.运行时的使用 向分类中添加属性 // 包含运行时头文件 #import <objc/runtime.h> /* void objc_setAssociatedObject(id obj ...
- oc - runtime运行机制
Objective-C语言是一门动态语言,它将很多静态语言在编译和链接时做的事放到了运行时来处理.同时OC也是一门简单的语言,很大一部分是C的内容,只是在语言层面上加了关键字和语法,真正让OC强大 ...
- 18 (OC)* RunTime
目录: 一.怎么理解OC是动态语言,Runtime又是什么?二.理解消息机制的基本原理三.与Runtime交互的三种方式四.分析Runtime中的数据结构五.深入理解Rutime消息发送原理六.多继承 ...
- OC - runtime - 1
- OC 相关
1.OC runtime的理解[转载] http://www.csdn.net/article/2015-07-06/2825133-objective-c-runtime/1
- iOS RunTime运行时(1):类与对象
Objective-C语言是一门动态语言,他将很多静态语言在编译和链接期做的事放到了运行时来处理.这种动态语言的优势在于:我们写代码更具有灵活性,如我们可以把消息转发给我们想要的对象,或者随意交换一下 ...
- iOS运行时Runtime浅析
运行时是iOS中一个很重要的概念,iOS运行过程中都会被转化为runtime的C代码执行.例如[target doSomething];会被转化成objc)msgSend(target,@select ...
- Objective-C的对象模型和runtime机制
内容列表 对象模型(结构定义,类对象.元类和实例对象的关系) 消息传递和转发机制 runtime系统功能理解 对象模型 结构定义 对象(Object): OC中基本构造单元 (building blo ...
随机推荐
- SQL 语言 - 数据库系统原理
SQL 发展历程 从 1970 年美国 IBM 研究中心的 E.F.Codd 发表论文到 1974 年 Boyce 和 Chamberlin 把 SQUARE 语言改为 SEQUEL 语言,到现在的 ...
- redis 3.2.6 on ubuntu 14.04
1. official site: https://github.com/antirez/redis/releases 2. compile and setup tar zxf redis-3.2.6 ...
- ibm v3700
raid5总容量计算(n-1)*最小盘容量RAID0:N块盘组成,逻辑容量为N块盘容量之和:RAID1:两块盘组成,逻辑容量为一块盘容量:RAID3:N+1块盘组成,逻辑容量为N块盘容量之和:RAID ...
- lvs的dr模式分析(二)
#vim /etc/init.d/lvsdrrip #!/bin/bash #DR server VIP=192.168.46.200 case "$1" in start) ...
- Java基础--serialVersionUID
Java基础--serialVersionUID serialVersionUID作用: 序列化时为了保持版本的兼容性,即在版本升级时反序列化仍保持对象的唯一性.有两种生成方式: 一个是默认的1L,比 ...
- R语言-实用数据对象处理函数
length(object) 显示对象中元素/成分的数量 dim(object) 显示某个对象的维度 str(object) 显示某个对象的结构 class(object) 显示某个对象的类或类型 m ...
- 用Maven新建Web项目时报错
在cmd下,用mvn命令 mvn archetype:create -DgroupId=org.seckill -DartifactId=seckill -DarchetypeArtifactId=m ...
- 百度地图API地理位置和坐标转换
1.由地名(省份.城市.街道等)得到其对应的百度地图坐标: http://api.map.baidu.com/geocoder/v2/?output=json&ak=你从百度申请到的Key&a ...
- onAttachedToWindow () 和 onDetachedFromWindow () (转)
原文地址:http://blog.sina.com.cn/s/blog_74c22b2101012urv.html
- c# 变量,对象,静态类型,集合类的线程安全回顾
1.变量的线程安全性与变量的作用域有关. 2.对象 对象是类型的实例 在创建对象时,会单独有内存区域存储对象的属性和方法.所以,一个类型的多个实例,在执行时,只要没有静态变量的参与,应该都是线程安全的 ...