快速理解Runtime of Objective-C

原创 2016年03月28日 11:11:45

Runtime到底是什么鬼?


无论面试、论坛、群组...只要是跟ios开发有关的地方,到处都有runtime这个词。各种文章描述的神乎其技,就差把量子物理或者弦理论的知识也用上了。这么diao的东西到底是什么那?我们用最简单的方式来介绍一下,保证只要是猿类,就一定能听懂。


1: 什么是runtime

runtime,就是运行时,意思就是在运行的时候xxoo”

没错就是这么简单,解释一下:Objective-C程序运行的时候,需要一个底层库的支持,这个底层库就叫做runtime

Objective-C语言把很多在编译和链接时候需要做的工作,推迟到了程序运行的时候由runtime来完成。runtime就好像是Objective-C语言的操作系统。这意味着该语言不仅需要一个编译器,还需要runtime来执行编译后的代码(在非mac平台使用了其他方案)。


2: 为什么要runtime

runtimeOC变得更加灵活。或许只是你没注意,大多数人都直接使用过runtime的功能的,最常见的就是:


//判断一个类是否可以执行一个方法[通常用在判断代理(delegate)是否实现了@protocol(协议)的可选(@optional)方法时)


    if ([self.delegate respondsToSelector:@selector(fun)]) {

        [self.delegate fun];

    } else {

        //self.delegate 没有实现fun方法;

    }


上面代码的功能,就是在“运行的时候”,判断一个类是否实现了某个方法。respondsToSelector提供的这种功能,就是对runtime的直接使用。


3: runtime还可以做什么?

通过上面的例子,估计你对runtime已经有了一个大概的理解。其实,在开发过程中,直接依赖runtime开发是比较少的,但是runtime却无处不在,OC的大部分功能都是通过运行时来完成的。甚至,调用一个方法:


    [myobject fun];


仔细想想,最初学习OC的时候,是不是看到过发送消息这句话?没错,[myobject fun]并不是简单的方法调用,而是在运行时给myobject发送了一个fun消息,如果myobject能够找到对应的fun处理逻辑,就会去执行fun消息的处理逻辑(就是fun方法的实现)


编译阶段,

    [myobject fun];

会被转换为:

    objc_msgSend(myobject, @selector(fun))


可见,编译阶段只确定了运行时会向接收者myobject发送这条消息而已。


既然是运行时完成的,那么我们不就可以在运行时动态的改变调用的目标、查看一个对象可以处理的所有消息、包含的成员名称等等吗?甚至可以通过动态生成的一个字符串形式的类名+方法名,去调用这个类的方法。 这就是runtime可以做的事。


例:使用字符串描述的类名+方法名,动态调用这个类的对应方法


    Class targetClass = NSClassFromString(@"ViewController");

    id target = [[targetClass alloc] init];

    SEL action = NSSelectorFromString(@"fun");

#pragma clang diagnostic push

#pragma clang diagnostic ignored "-Warc-performSelector-leaks"

    [target performSelector:action];

#pragma clang diagnostic pop

//3#pragma *** 用于去掉编译器警告



当然,runtime的具体应用和原理还是比较复杂的,除了去看一大堆文档,我没发现什么捷径可以快速学习。


其实写这篇文章的主要目的,是为了给下一篇文章:“ios业务模块间互相跳转的解耦方案做技术铺垫。如果你读完了这篇文章,不妨去看看,相信会有收获的 ^^。链接地址:

http://mp.weixin.qq.com/s?__biz=MzIxNDI0OTAzOQ==&mid=403079862&idx=1&sn=a2ebc5a3afbd80d034c371f70bfa06d4#rd


对于runtime详细的原理和描述有很多人写过了,我就不写了,找了几篇比较不错的链接:


苹果的官方文档:

https://developer.apple.com/library/mac/documentation/Cocoa/Reference/ObjCRuntimeRef/index.html

https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Introduction/Introduction.html


从源代码的角度分析了runtime的具体实现:

http://www.jianshu.com/p/25a319aee33d


runtime的应用场景和实例:

http://blog.csdn.net/jasonblog/article/details/7246822

http://www.cocoachina.com/ios/20160128/15154.html


*转载请包涵以下内容


欢迎大家关注我:iDevShare

或加我微信:lofocus


版权声明:本文为博主原创文章,未经博主允许不得转载。博主微信:lofocus https://blog.csdn.net/cuibo1123/article/details/50996369

MFC编程中“占位符和动态创建”技巧的应用

 刘勇  夏安邦       在MFC编程中,“占位符和动态创建”技巧的应用是十分广泛的,虽然在有些编程书籍和文章中有所涉及,但缺乏系统的介绍和必要的总结,给应用带来不便。本文将对这方面的编程技巧进行...
  • think77
  • think77
  • 2001-01-06 16:43:00
  • 735

对Objective-C的runtime的一些理解

首先copy某位博主的写的一段关于runtime的介绍:runtime是一套比较底层的纯C语言API, 属于1个C语言库, 包含了很多底层的C语言API。 在我们平时编写的OC代码中, 程序运行过程...
  • ShorewB
  • ShorewB
  • 2016-02-27 17:56:19
  • 642

深入理解 Objective-C Runtime

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

Objective-C内存管理机制

Objective-C内存管理机制   1.Objective-C中所有对象都在堆区建立,由程序员负责释放对象所占用的内存。内存管理机制由3种: 垃圾回收、引用计数、C语言方式。 2.垃圾回收...
  • TskyFree
  • TskyFree
  • 2012-09-09 09:52:01
  • 4217

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

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

Objective-C Runtime Programming Guide 中文翻译

介绍Objective-C将许多决策从便宜时期和链接时期延后到运行时期。只要可能,它都动态的做很多事情。这意味着它不仅需要一个编译器,还需要一个运行时系统来执行编译好的代码。对于Objective-C...
  • syd_programming
  • syd_programming
  • 2016-05-16 22:10:34
  • 4361

Objective-C运行时编程指南(Objective-C Runtime Programming Guide)

简介 Objective-C语言进可能将许多决策从编译和链接延缓到运行时。它尽可能的动态处理事务。这意味着Objective-C不仅需要编译器还需要执行编译代码的运行时系统。运行时系统充当Object...
  • iosswift
  • iosswift
  • 2014-12-29 21:29:31
  • 5226

Objective-C是动态运行时语言是什么意思?

Objective-C是动态运行时语言是什么意思? (When we call objective c is runtimelanguage what does it mean?) 主要是将数据类型...
  • dingwenchao456
  • dingwenchao456
  • 2016-03-18 11:19:51
  • 351

Objective-C Runtime 运行时:成员变量(ivars)及属性

获取类的成员变量和属性: (这里有篇文章写得很详细关于Runtime 运行时:http://www.cocoachina.com/ios/20141031/10105.html) 在obj...
  • raoxudong
  • raoxudong
  • 2015-09-06 13:29:00
  • 1483

刨根问底Objective-C Runtime(唐巧)

前言 关于Objective-C Runtime一篇好的文档 : Understanding the Objective-C Runtime 译文地址为: http://blog.coco...
  • SHZnt
  • SHZnt
  • 2016-01-08 11:51:35
  • 2957
收藏助手
不良信息举报
您举报文章:快速理解Runtime of Objective-C
举报原因:
原因补充:

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