Runtime详解——iOS开发中的黑魔法

简介

Runtime 又叫运行时,是一套底层的 C 语言 API,其为 iOS 内部的核心之一,咱们平时编写的 OC 代码,底层都是基于它来实现的。好比:编程

[receiver message];
// 底层运行时会被编译器转化为:
objc_msgSend(receiver, selector)
// 若是其还有参数好比:
[receiver message:(id)arg...];
// 底层运行时会被编译器转化为:
objc_msgSend(receiver, selector, arg1, arg2, ...)

以上你可能看不出它的价值,可是咱们须要了解的是 Objective-C 是一门动态语言,它会将一些工做放在代码运行时才处理而并不是编译时。也就是说,有不少类和成员变量在咱们编译的时是不知道的,而在运行时,咱们所编写的代码会转换成完整的肯定的代码运行。安全

所以,编译器是不够的,咱们还须要一个运行时系统(Runtime system)来处理编译后的代码。数据结构

Runtime 基本是用 C 和汇编写的,因而可知苹果为了动态系统的高效而作出的努力。苹果和 GNU 各自维护一个开源的 Runtime 版本,这两个版本之间都在努力保持一致。app

点击这里下载苹果维护的开源代码。框架

Runtime 的做用

Objc 在三种层面上与 Runtime 系统进行交互:函数

  1. 经过 Objective-C 源代码
  2. 经过 Foundation 框架的 NSObject 类定义的方法
  3. 经过对 Runtime 库函数的直接调用

Objective-C 源代码

多数状况咱们只须要编写 OC 代码便可,Runtime 系统自动在幕后搞定一切,还记得简介中若是咱们调用方法,编译器会将 OC 代码转换成运行时代码,在运行时肯定数据结构和函数。学习

经过 Foundation 框架的 NSObject 类定义的方法

Cocoa 程序中绝大部分类都是 NSObject 类的子类,因此都继承了 NSObject 的行为。(NSProxy 类时个例外,它是个抽象超类)spa

一些状况下,NSObject 类仅仅定义了完成某件事情的模板,并无提供所须要的代码。例如 -description 方法,该方法返回类内容的字符串表示,该方法主要用来调试程序。NSObject 类并不知道子类的内容,因此它只是返回类的名字和对象的地址,NSObject 的子类能够从新实现。debug

还有一些 NSObject 的方法能够从 Runtime 系统中获取信息,容许对象进行自我检查。例如:设计

  • -class方法返回对象的类;
  • -isKindOfClass: 和 -isMemberOfClass: 方法检查对象是否存在于指定的类的继承体系中(是不是其子类或者父类或者当前类的成员变量);
  • -respondsToSelector: 检查对象可否响应指定的消息;
  • -conformsToProtocol:检查对象是否实现了指定协议类的方法;
  • -methodForSelector: 返回指定方法实现的地址。

经过对 Runtime 库函数的直接调用

Runtime 系统是具备公共接口的动态共享库。头文件存放于/usr/include/objc目录下,这意味着咱们使用时只须要引入objc/Runtime.h头文件便可。

许多函数可让你使用纯 C 代码来实现 Objc 中一样的功能。除非是写一些 Objc 与其余语言的桥接或是底层的 debug 工做,你在写 Objc 代码时通常不会用到这些 C 语言函数。

Runtime深刻讲解——Aspects 源码解析

AOP 即面向切面编程,初次接触 AOP 的人可能会困惑,到底什么是 AOP。举个简单的列子,通常随着业务和产品的发展,产品须要在页面中加入本身的页面统计。这个时候咱们会怎么作?面向对象的思想是这些统计功能不少页面都会用到,每一个 VC 写一次特别麻烦,因而全部的 VC 都继承自一个基类。并且随着项目的增大,通常咱们会把一些经常使用的功能写成组件的形式来使用,这时就抽取出来的功能可能就要依赖这个基类,抽取的时候就比较难受。因此这个时候 AOP 就能够完美的解决这个问题,对于 OC 来讲,咱们能够直接 Method-Swizzling 来 Hook 当前的 viewWillAppear 和 viewWillDisappear 而后统计信息。可是这种简单的 Method-Swizzling 其实存在必定的安全隐患。

Aspects 是一个使用简单的 AOP 库,适用于 iOS 和 OS X

在本节课当中咱们能够学习到做者是如何设计这个库,以及在 Hook 过程当中处理了不少可能发生的隐患问题。一样这里面涉及到不少 Runtime 的知识,绝对是学习进阶的好资料。

知识点

  • 一、Aspects 类结构分析
  • 二、Aspects 核心原理讲解
  • 三、Aspects 流程分析

关于本次在线直播发布

1、直播时间

     2018年12月25日晚上20:00

2、主讲人

     Kody老师

3、加入直播

     长按识别下方二维码,经过小编验证后便可得到入群参加线上直播以及课前资料。
iOS开发交流群聊二维码.png

相关文章
相关标签/搜索