Jplane 2019-06-30
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 版本,这两个版本之间都在努力保持一致。
点击这里下载苹果维护的开源代码。
Objc 在三种层面上与 Runtime 系统进行交互:
多数情况我们只需要编写 OC 代码即可,Runtime 系统自动在幕后搞定一切,还记得简介中如果我们调用方法,编译器会将 OC 代码转换成运行时代码,在运行时确定数据结构和函数。
Cocoa 程序中绝大部分类都是 NSObject 类的子类,所以都继承了 NSObject 的行为。(NSProxy 类时个例外,它是个抽象超类)
一些情况下,NSObject 类仅仅定义了完成某件事情的模板,并没有提供所需要的代码。例如 -description
方法,该方法返回类内容的字符串表示,该方法主要用来调试程序。NSObject 类并不知道子类的内容,所以它只是返回类的名字和对象的地址,NSObject 的子类可以重新实现。
还有一些 NSObject 的方法可以从 Runtime 系统中获取信息,允许对象进行自我检查。例如:
-class
方法返回对象的类;-isKindOfClass:
和 -isMemberOfClass:
方法检查对象是否存在于指定的类的继承体系中(是否是其子类或者父类或者当前类的成员变量);-respondsToSelector:
检查对象能否响应指定的消息;-conformsToProtocol:
检查对象是否实现了指定协议类的方法;-methodForSelector:
返回指定方法实现的地址。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 的知识,绝对是学习进阶的好资料。
知识点:
关于本次在线直播发布
一、直播时间
2018年12月25日晚上20:00
二、主讲人
Kody老师
三、加入直播
长按识别下方二维码,通过小编验证后即可获得入群参加线上直播以及课前资料。
hive运行在hadoop基础上。选择一个hadoop服务器、安装hadoop。connect jdbc:hive2://<host>:<port>/<db>;auth=noSasl root 123