Использование метаданных Objective-C для создания графика зависимости классов - PullRequest
6 голосов
/ 28 августа 2011

Этот парень придумал довольно аккуратный инструмент для генерации графа зависимостей классов - однако он основывается на анализе вашего исходного кода и поиске директив #import.

Это здорово, но у меня есть ряд проблем с этим. Не в последнюю очередь из-за того, что он не учитывает импорт импорта, ни префиксные заголовки, ни то, действительно ли используются класс (ы) в файле, на который ссылается импорт.

Я хотел бы сделать что-то более похожее на class-dump и изучить метаданные Objective-C, хранящиеся в файле Mach-O, чтобы сгенерировать представление зависимостей класса в памяти.

Я бы предпочел не делать этого с нуля, поэтому мне интересно:

  • Это уже было сделано?
  • Существует ли библиотека с открытым исходным кодом, которая предоставила бы мне основополагающие инструменты, необходимые для извлечения этой информации (библиотека, которая проверяет файл Mach-O и создает фасад информации Objective-C, содержащейся внутри - так, чтобы я мог бы перебирать все классы, их методы, свойства, ivars и т. д. и сканировать ссылки на другие классы) Я думаю, что источник class-dump будет хорошим началом.
  • Если у вас есть опыт в подобных вещах, возможно ли то, что я пытаюсь достичь?
  • Какие препятствия мне нужно будет преодолеть?

Ответы [ 3 ]

3 голосов
/ 29 августа 2011

Это уже было сделано?

Не знаю, о чем я.

Есть ли библиотека с открытым исходным кодом, которая предоставила бы мне основополагающийинструменты, которые мне нужны для извлечения этой информации?

В основе class-dump лежит libMachObjC, что делает именно то, что вы хотите, то есть анализ всех классов / методов / ivars иБольше.API очень чистый, его очень легко использовать.

Если у вас есть опыт в подобных вещах, возможно ли то, что я пытаюсь достичь?

К сожалению, нет, потому что некоторые классы не объявляют реальный класс, а вместо этого используют id.Например, вот информация, которую можно извлечь из дампа класса UIKit:

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

Информация о типе _rowData ivar id, но если вы проверите во время выполнения, вы увидите, что _rowData является экземпляром класса UITableViewRowData.Эта информация отсутствует в двоичном файле Mach-O, поэтому вы не можете найти связь между UITableView и UITableViewRowData.То же самое относится к параметрам метода.

2 голосов
/ 27 ноября 2015

Вот решение, которое опирается на информацию в файлах mach.o и генерирует зависимость графика на основе этой информации: https://github.com/PaulTaykalo/objc-dependency-visualizer enter image description here

1 голос
/ 28 августа 2011

Это уже сделано?

да - но я не могу рекомендовать хорошую публичную реализацию

Существует ли библиотека с открытым исходным кодом, которая предоставила бы мне основополагающие инструменты, необходимые для извлечения этой информации (библиотека, которая проверяет файл Mach-O и создает фасад информации Objective-C, содержащейся внутри - так, чтобы я мог бы перебирать все классы, их методы, свойства, ivars и т. д. и сканировать ссылки на другие классы) Я думаю, что источник class-dump будет хорошим началом.

В большинстве случаев было бы полезно использовать средства выполнения objc objc/... вместо изучения двоичного файла.

Если у вас есть опыт в подобных вещах, возможно ли то, что я пытаюсь достичь?

да. я сделал нечто подобное, используя среду выполнения objc.

Какие препятствия мне нужно будет преодолеть?

это зависит в значительной степени от уровня детализации, который вы хотите ... время реализации, если вы не найдете такой реализации, но я полагаю, вы найдете несколько вариантов, если вы Google Google более эзотерические функции во время выполнения objc; возможно, вы найдете его в (открытом) языковом связывании или мосте?

если вы все-таки написали один самостоятельно, вы можете получить зарегистрированные классы objc, используя objc_getClassList, а затем получить доступ к нужным вам свойствам / информации.

...