使用Objective-C元数据生成类依赖图

时间:2011-08-28 04:48:13

标签: objective-c objective-c-runtime mach-o

这家伙提出了一个非常简洁的工具来生成类依赖图 - 但是,它依赖于解析源代码并查找#import指令。

这很整洁,但我有很多问题。其中最重要的是它不考虑导入的导入,也不考虑前缀标题,也不考虑导入所引用的文件中的类是否实际被使用。

我想做更类似于class-dump的事情,并检查存储在Mach-O文件中的Objective-C元数据,以生成类依赖关系的内存中表示。

我宁愿不从头开始这样做,所以我想知道:

  • 它已经完成了吗?
  • 是否有一个开源库,它将为我提供提取此信息所需的基础工具(一个库,它检查Mach-O文件并创建一个包含在其中的Objective-C信息的外观 - 这样我可以遍历所有类,它们的方法,属性,ivars等,并扫描对其他类的引用)我认为class-dump的源代码是一个很好的起点。
  • 如果你有这方面的经验,我正在努力实现这个目标吗?
  • 我需要克服哪些障碍?

3 个答案:

答案 0 :(得分:3)

  

它已经完成了吗?

不是我知道的。

  

是否有一个开源库可以为我提供   我需要提取这些信息的基础工具吗?

class-dump的核心是libMachObjC,它可以完全满足您的需求,即解析所有类/方法/ iv等等。 API很干净,应该很容易使用。

  

如果你有这方面的经验,那就是我想要的   完成可行吗?

不幸的是,不是因为某些类没有声明真正的类而是使用id。例如,以下是可以从UIKit的类转储中提取的信息:

@interface UITableView : UIScrollView <NSCoding>
{
    int _style;
    id <UITableViewDataSource> _dataSource;
    id _rowData;
    ...

_rowData ivar类型信息为id,但如果您在运行时检查,您会看到_rowDataUITableViewRowData类的实例。 Mach-O二进制文件中不存在此信息,因此您无法找到UITableViewUITableViewRowData之间的关系。这同样适用于方法参数。

答案 1 :(得分:2)

这是一个依赖于mach.o文件中信息的解决方案,并根据该信息生成图形依赖:https://github.com/PaulTaykalo/objc-dependency-visualizer enter image description here

答案 2 :(得分:1)

  

它已经完成了吗?

是的 - 但我不能推荐一个好的公共实施

  

是否有一个开源库,它将为我提供提取此信息所需的基础工具(一个库,它检查Mach-O文件并创建包含在其中的Objective-C信息的外观 - 这样我可以遍历所有类,它们的方法,属性,ivars等,并扫描对其他类的引用)我认为class-dump的源代码是一个很好的起点。

大多数用例都可以通过使用objc运行时工具objc/...而不是检查二进制文件来获益。

  

如果你有这方面的经验,我正在努力实现可行性吗?

是肯定的。我使用objc运行时做了类似的事情。

  

我需要克服哪些障碍?

这在很大程度上取决于你想要的细节水平...如果你没有找到这样的实现,实现时间,但我想你会发现一些选项,如果你在objc运行时谷歌更多深奥的功能;也许你会在(开放)语言绑定或桥梁中找到一个?

如果你自己最终写了一个,你可以使用objc_getClassList获得注册的objc课程,然后从那里访问你想要的属性/信息。