
在iOS开发过程中,使用Runtime的场景虽然没有GCD多,但是也是一个不容忽视的模块,而且在面试找工作的时候也是面试官必考题。那么下面就来了解一下Runtime的相关知识,大牛请绕行,不喜勿喷。
一、Runtime概念
1.Runtime,又叫运行时,是一套关于底层的C语言API,为iOS内部的核心之一,我们在编写OC代码的时候,底层都是基于它来实现的。
eg:[receiver message];
底层运行时会被编译器转化为:
objc_msgSend(receiver, selector)
如果它还有参数,比如:
[receiver message:(id)arg...];
底层运行时,会被编译器转化为:
objc_msgSend(receiver, selector, arg1, arg2, ...)
2.为什么需要Runtime:
Objective-C是一门面向对象的动态语言,它会将一些工作放在代码运行时才处理而并非编译时。也就是说,有很多类和成员变量在编译的时候是不知道的,而在运行时,所编写的代码会转换成完整的确定的代码运行。因此,指望编译器是远远不够的,还需要一个运行时系统(Runtime system)来处理编译后的代码。Runtime基本是用C和汇编写的,由此可见苹果为了动态系统的高效而做出的努力。苹果和GNU各自维护一个开源的Runtime版本,这两个版本之间都在努力保持一致。
3.Runtime的作用:
Objective-C在三种层面上与Runtime系统进行交互:
1.通过OC源代码
只需要编写OC代码,Runtime系统自动在后台搞定一切,调用方法,编译器会将OC代码转换成运行时代码,在运行时确定数据结构和函数。
2.通过Foundation框架的NSObject类定义的方法
Cocoa程序中绝大部分类都是NSObject类的子类,所以都继承了NSObject的行为。(NSProxy类是个例外,它是个抽象超类)
一些情况下,NSObject类仅仅定义了完成某件事情的模板,并没有提供所需要的代码。例如-description方法,该方法返回类内容的字符串表示,该方法主要用来调试程序。NSObject类并不知道子类的内容,所以它只是返回类的名字和对象的地址,NSObject的子类可以重新实现。
还有一些NSObject的方法可以从Runtime系统中获取信息,允许对象进行自我检查。例如:
-class方法返回对象的类;
-isKindOfClass: 和 -isMemberOfClass: 方法检查对象是否存在于指定的类的继承体系中(是否是其子类或者父类或者当前类的成员变量);
-respondsToSelector: 检查对象能否响应指定的消息;
-conformsToProtocol:检查对象是否实现了指定协议类的方法;
-methodForSelector: 返回指定方法实现的地址。
3.通过对Runtime库函数的直接调用
Runtime系统是具有公共接口的动态共享库。头文件存放于/usr/include/objc目录下,这意味着开发者使用时只需要引入objc/Runtime.h头文件即可。
许多函数可以让你使用C语言来实现Objc中同样的功能。除非是写一些OC与其他语言的桥接或是底层的debug工作,开发者在写OC代码时一般不会用到这些C语言函数。
二、Runtime的相关术语
1.SEL
它是selector在OC中的表示(Swift中是Selector类)。selector是方法选择器,其实作用就和名字一样,日常生活中,我们通过人名辨别谁是谁,注意OC在相同的类中不会有命名相同的两个方法。selector 对方法名进行包装,以便找到对应的方法实现。它的数据结构是:typedef struct objc_selector *SEL;
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-86234-1.html
靠分红成吗