深入理解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机制

http://www.csdn.net/article/2015-07-06/2825133-objective-c-runtime/6 深入理解Objective-C的Ru...

深入理解Objective-C的Runtime机制

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

深入理解Objective-C的Runtime机制

觉得还不错的一篇关于Runtime的文。

Objective-C Runtime深入理解(三)

当人们初学 Cocoa/Objective-C 时,Objective-C Runtime 是被忽略的特性之一。原因是 Objective-C(这门语言)很容易在几小时内就熟悉,新学 Cocoa 的人...
  • tjy_tyj
  • tjy_tyj
  • 2016年10月19日 17:27
  • 342

深入理解 Objective-C Runtime

当人们初学 Cocoa/Objective-C 时,Objective-C Runtime 是被忽略的特性之一。原因是 Objective-C(这门语言)很容易在几小时内就熟悉,新学 Cocoa 的人...

Objective-C Runtime深入理解(一)

RunTime简称运行时。就是系统在运行的时候的一些机制,其中最主要的是消息机制。对于C语言,函数的调用在编译的时候会决定调用哪个函数( C语言的函数调用请看这里 )。编译完成之后直接顺序执行,无任何...
  • tjy_tyj
  • tjy_tyj
  • 2016年10月19日 16:49
  • 99

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

本文转自:http://www.cocoachina.com/ios/20141018/9960.html 最近在找工作,Objective-C中的Runtime是经常被问到的一个问题,几乎...

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

RunTime简称运行时。就是系统在运行的时候的一些机制,其中最主要的是消息机制。对于C语言,函数的调用在编译的时候会决定调用哪个函数( C语言的函数调用请看这里 )。编译完成之后直接顺序执行,无任何...

Objective-C Runtime机制详解

Objective-C语言是一门动态语言,它将很多静态语言在编译和链接时做的事放到了运行时来处理。同时OC也是一门简单的语言,很大一部分是C的内容,只是在语言层面上加了关键字和语法,真正让OC强大的是...

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

最近在找工作,Objective-C中的Runtime是经常被问到的一个问题,几乎是面试大公司必问的一个问题。当然还有一些其他问题也几乎必问,例 如:RunLoop,Block,内存管理等。其他的问题...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深入理解Objective-C的Runtime机制
举报原因:
原因补充:

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