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

栏目: IOS · 发布时间: 7年前

内容简介:本系列博客是本人的源码阅读笔记,如果有iOS开发者在看runtime的,欢迎大家多多交流。为了方便讨论,本人新建了一个微信群(iOS技术讨论群),想要加入的,请添加本人微信:zhujinhui207407,【加我前请备注:ios 】,本人博客http://www.kyson.cn 也在不停的更新中,欢迎一起讨论相信接触过iOS的同学对runtime或多或少都有耳闻。 创建一个对象:点击进入其定义:

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

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

引言

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

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

点击进入其定义:

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

可以发现其进入了文件 NSObject.h

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

右击该文件,选择: show in Finder 可以看到 runtime 暴露给我们的文件:

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

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

笔者研究runtime源码有一段时间了,随着研究的深入,对runtime的实现也越来越感兴趣,因此想写一套系列教程来和大家讨论runtime的底层实现。

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

下载源码

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

编译

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

runtime源码706

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

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

目录分析

runtime源码目录结构如下:

iOS开发之runtime(一):runtime调试环境搭建
  • include 文件夹是我们引入的项目需要的依赖文件

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

    iOS开发之runtime(一):runtime调试环境搭建
  • 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中完成的。 具体实现流程,会在后面的文章中逐步揭晓。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

智能

智能

[法]弗雷德里克·马特尔 / 君瑞图、左玉冰 / 商务印书馆 / 2015-8 / 59.90

揭示数字化主流大趋势的最新权威论著 《主流》作者的最新力作!与法国秋季新版同步上市! 面对数字化时代的到来,美国、欧盟、中国、俄罗斯、印度、巴西、古巴、伊朗、南非、韩国、新加坡、肯尼亚、墨西哥、日本等世界各国各地区正在如何应对? 在国际地缘政治格局下如何把握数字化主流的大趋势? 谷歌、苹果、脸书、亚马逊、阿里巴巴、腾讯、中兴、华为等大家熟知的网络巨头接受了作者的采访。作者的......一起来看看 《智能》 这本书的介绍吧!

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

URL 编码/解码
URL 编码/解码

URL 编码/解码

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换