深入理解Objective-C的Runtime机制

转载 2015年07月07日 08:57:16
http://www.csdn.net/article/2015-07-06/2825133-objective-c-runtime
摘要:Objective-C是基于C加入了面向对象特性和消息转发机制的动态语言,除编译器之外,还需用Runtime系统来动态创建类和对象,进行消息发送和转发。本文作者通过分析Apple开源的Runtime代码来深入理解OC的Runtime机制。

Objective-C是基于C语言加入了面向对象特性和消息转发机制的动态语言,这意味着它不仅需要一个编译器,还需要Runtime系统来动态创建类和对象,进行消息发送和转发。下面通过分析Apple开源的Runtime代码(我使用的版本是objc4-646.tar)来深入理解Objective-C的Runtime机制。

Runtime数据结构

在Objective-C中,使用[receiver message]语法并不会马上执行receiver对象的message方法的代码,而是向receiver发送一条message消息,这条消息可能由receiver来处理,也可能由转发给其他对象来处理,也有可能假装没有接收到这条消息而没有处理。其实[receiver message]被编译器转化为:

  1. id objc_msgSend ( id self, SEL op, ... );  

下面从两个数据结构id和SEL来逐步分析和理解Runtime有哪些重要的数据结构。

SEL

SEL是函数objc_msgSend第二个参数的数据类型,表示方法选择器,按下面路径打开objc.h文件:

SEL Data Structure

查看到SEL数据结构如下:

  1. typedef struct objc_selector *SEL;  

其实它就是映射到方法的C字符串,你可以通过Objc编译器命令@selector()或者Runtime系统的sel_registerName函数来获取一个SEL类型的方法选择器。

如果你知道selector对应的方法名是什么,可以通过NSString* NSStringFromSelector(SEL aSelector)方法将SEL转化为字符串,再用NSLog打印。

id

接下来看objc_msgSend第一个参数的数据类型id,id是通用类型指针,能够表示任何对象。按下面路径打开objc.h文件:

id Data Structure

查看到id数据结构如下:

  1. /// Represents an instance of a class.  
  2. struct objc_object {  
  3.     Class isa  OBJC_ISA_AVAILABILITY;  
  4. };  
  5.   
  6. /// A pointer to an instance of a class.  
  7. typedef struct objc_object *id;  

id其实就是一个指向objc_object结构体指针,它包含一个Class isa成员,根据isa指针就可以顺藤摸瓜找到对象所属的类。

注意:根据Apple的官方文档Key-Value Observing Implementation Details提及,key-value observing是使用isa-swizzling的技术实现的,isa指针在运行时被修改,指向一个中间类而不是真正的类。所以,你不应该使用isa指针来确定类的关系,而是使用class方法来确定实例对象的类。

Class

isa指针的数据类型是Class,Class表示对象所属的类,按下面路径打开objc.h文件:


Class Data Structure

  1. /// An opaque type that represents an Objective-C class.  
  2. typedef struct objc_class *Class;  

可以查看到Class其实就是一个objc_class结构体指针,但这个头文件找不到它的定义,需要在runtime.h才能找到objc_class结构体的定义。

按下面路径打开runtime.h文件:

objc_class Data Structure

本文导读

深入理解Objective-C的Runtime机制

摘要:Objective-C是基于C加入了面向对象特性和消息转发机制的动态语言,除编译器之外,还需用Runtime系统来动态创建类和对象,进行消息发送和转发。本文作者通过分析Apple开源的Runti...
  • sos995
  • sos995
  • 2016年04月05日 22:16
  • 622

深入理解Objective-C的Runtime机制

摘要:Objective-C是基于C加入了面向对象特性和消息转发机制的动态语言,除编译器之外,还需用Runtime系统来动态创建类和对象,进行消息发送和转发。本文作者通过分析Apple开源的Runti...
  • bravegogo
  • bravegogo
  • 2016年04月27日 12:41
  • 182

深入理解Objective-C的Runtime机制

觉得还不错的一篇关于Runtime的文。
  • ybcy0612
  • ybcy0612
  • 2016年03月24日 16:28
  • 198

深入理解Objective-C的Runtime机制

Objective-C是基于C语言加入了面向对象特性和消息转发机制的动态语言,这意味着它不仅需要一个编译器,还需要Runtime系统来动态创建类和对象,进行消息发送和转发。下面通过分析Apple开源的...
  • Heaven_OY
  • Heaven_OY
  • 2016年11月09日 10:07
  • 306

深入理解Objective-C的Runtime机制

http://www.csdn.net/article/2015-07-06/2825133-objective-c-runtime/6 深入理解Objective-C的Ru...
  • LiuShuaile
  • LiuShuaile
  • 2017年03月22日 11:30
  • 294

iOS中runtime运行机制解析

一.先思考两个问题: 第一个问题, 1》runtime实现的机制是什么,怎么用,一般用于干嘛? 这个问题我就不跟大家绕弯子了,直接告诉大家, runtime是一套比较底层的纯C语言API, 属...
  • fuzheng0301
  • fuzheng0301
  • 2015年07月15日 20:49
  • 2654

深入理解Objective-C的Runtime机制

Objective-C是基于C语言加入了面向对象特性和消息转发机制的动态语言,这意味着它不仅需要一个编译器,还需要Runtime系统来动态创建类和对象,进行消息发送和转发。下面通过分析Apple开源的...
  • qq315615051
  • qq315615051
  • 2016年03月24日 09:43
  • 103

Objective-C Runtime 总结:消息机制 篇

Objective-C语言是一门动态语言,它将很多静态语言在编译和链接时期做的事放到了运行时来处理。这种动态语言的优势在于:我们写代码时更具灵活性,如我们可以把消息转发给我们想要的对象,或者随意交换一...
  • bluefish89
  • bluefish89
  • 2015年12月24日 18:05
  • 738

Objective-C总Runtime的那点事儿(一)消息机制

本文转自:http://www.cocoachina.com/ios/20141018/9960.html 最近在找工作,Objective-C中的Runtime是经常被问到的一个问题,几乎...
  • a19860903
  • a19860903
  • 2015年04月03日 12:30
  • 39405

Objective-C Runtime深入理解(一)

RunTime简称运行时。就是系统在运行的时候的一些机制,其中最主要的是消息机制。对于C语言,函数的调用在编译的时候会决定调用哪个函数( C语言的函数调用请看这里 )。编译完成之后直接顺序执行,无任何...
  • tjy_tyj
  • tjy_tyj
  • 2016年10月19日 16:49
  • 129
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深入理解Objective-C的Runtime机制
举报原因:
原因补充:

(最多只允许输入30个字)