iOS Runtime 底层解析

2021-08-23  本文已影响0人  程序员进阶

一、对象(object)、 类(class)

类方法存在哪里?(元类里面)

对象方法存在哪里?(类里面)

\color{red}{类方法}\color{red}{元类} 里 以 \color{red}{实例方法} 存在;

\color{red}{对象方法} 在 \color{red}{类} 里 以 \color{red}{实例方法} 存在;

二、Objc 在三种层面上与 Runtime 系统进行交互/ Runtime的三种调用方式:

参考地址(详细介绍Runtime底层)

参考地址(Runtime底层基础)

1、通过对 Runtime 库函数(api)的直接调用;

2、通过 Foundation 框架的 NSObject 类定义的方法,如(iskindof、ismemberof);

3、通过 Objective-C 源代码(OC上层@selecter);

Objective-C 源代码

多数情况我们只需要编写 OC 代码即可,Runtime 系统自动在幕后搞定一切,还记得简介中如果我们调用方法,编译器会将 OC 代码转换成运行时代码,在运行时确定数据结构和函数。

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

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

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

还有一些 NSObject 的方法可以从 Runtime 系统中获取信息,允许对象进行自我检查。例如:

-class方法返回对象的类;

-isKindOfClass: 和 -isMemberOfClass: 方法检查对象是否存在于指定的类的继承体系中(是否是其子类或者父类或者当前类的成员变量);

-respondsToSelector: 检查对象能否响应指定的消息;

-conformsToProtocol:检查对象是否实现了指定协议类的方法;

-methodForSelector: 返回指定方法实现的地址。

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

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

许多函数可以让你使用纯 C 代码来实现 Objc 中同样的功能。除非是写一些 Objc 与其他语言的桥接或是底层的 debug 工作,你在写 Objc 代码时一般不会用到这些 C 语言函数。对于公共接口都有哪些,后面会讲到。我将会参考苹果官方的 API 文档。

点击这里下载苹果维护的开源代码。https://opensource.apple.com/tarballs  https://opensource.apple.com/source/objc4/  

上一篇下一篇

猜你喜欢

热点阅读