iOS开发之runtime(一):runtime调试环境搭建

本系列博客是本人的源码阅读笔记,若是有iOS开发者在看runtime的,欢迎你们多多交流。为了方便讨论,本人新建了一个微信群(iOS技术讨论群),想要加入的,请添加本人微信:zhujinhui207407,【加我前请备注:ios 】,本人博客http://www.kyson.cn 也在不停的更新中,欢迎一块儿讨论 ios

runtime logo

引言

相信接触过iOS的同窗对runtime或多或少都有耳闻。 建立一个对象:git

[[NSObject alloc] init];
复制代码

点击进入其定义: github

能够发现其进入了文件NSObject.h面试

NSObject

右击该文件,选择:show in Finder能够看到runtime暴露给咱们的文件: bash

虽然暴露给咱们的很少,但其实已经能提供给咱们不少功能,刚刚咱们的对象建立就是一个典型的功能。 众所周知,NSObject对象是Objective-C语言中几乎全部对象的根类。换言之,任何一个对象的建立都是经过runtime实现的,仅此一点,runtime的重要性可见一斑,如今的iOS面试也愈来愈经过对runtime的面试来区分iOS开发人员的水平高低。微信

笔者研究runtime源码有一段时间了,随着研究的深刻,对runtime的实现也愈来愈感兴趣,所以想写一套系列教程来和你们讨论runtime的底层实现。app


本文完整版详见笔者小专栏:xiaozhuanlan.com/runtime


下载源码

苹果开源了runtime的实现,在网站 opensource.apple.com/source/objc… 中能够找到各个版本的runtime源码。 但提供的是一个个文件,不方便打包下载,网站 opensource.apple.com/tarballs/ob…中提供了压缩包的下载。函数

编译

下载下来的runtime源码是运行不了的,缺乏一些依赖文件,找起来也比较繁琐。这里笔者fork了一份,供你们参考(该项目编译过程你们能够参考这篇文章:objc - 编译Runtime源码objc4-680):网站

runtime源码706ui

如图,打开工程后选择工程debug-objc,点击run便可。因为debug-objc依赖于objc(即runtime的源代码编译的库),所以咱们在main函数中全部Objective-C的代码会调用咱们编译的runtime,从而方便咱们调试。

目录分析

runtime源码目录结构以下:

  • include 文件夹是咱们引入的项目须要的依赖文件

  • Public Headers 文件夹是对外暴露的,点开后咱们不难发现,和文章开头给出的文件列表如出一辙:

  • Private Headers 从字面意思了解,是私有的一些方法

  • Project Headers runtime项目中会用到的头文件

  • Obsolete Headers 一些孤立的文件,大部分可删,只有hashtable2.h的文件会被其余文件使用到。

  • Obsolete Source 无实质用处,可全删

  • Source目录,是runtime的实现文件集合,后面的文章主要是研究这个目录。

小试牛刀

在咱们的main.m中,输入如下代码:

#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        NSObject *obj = [[NSObject alloc] init];
    }
    return 0;
}
复制代码

打断点后,咱们会发现NSObject *obj = [[NSObject alloc] init];方法最终会调用到runtime中的NSObject.mm中。也就是说,对象的建立都是在NSObject.mm中完成的。 具体实现流程,会在后面的文章中逐步揭晓。

注意

有人反馈项目编译不能经过,报以下错误:

dyld: Symbol not found: _objc_debug_taggedpointer_obfuscator
Referenced from: /usr/lib/system/libxpc.dylib
Expected in: ~/Library/Developer/Xcode/DerivedData/objc-ehlaekvxhzkjtdcmtvyuyxuygmfk/Build/Products/Debug/libobjc.A.dylib
in /usr/lib/system/libxpc.dylib
复制代码

缘由是由于系统版本过高,与runtime版本不兼容致使的。目前最新的runtime能够在这里下载: objc4-750适用于系统macOS Mojave。

点击桌面左上角能够看到系统版本

参考

dyld: Symbol not found: _objc_debug_taggedpointer_obfuscator

相关文章
相关标签/搜索