2011-08-28 7 views
6

A este tipo se le ocurrió una herramienta bastante ordenada para generar un gráfico de dependencia de clase; sin embargo, se basa en analizar su código fuente y buscar directivas #import.Usando Metadatos de Objective-C para Generar Gráfico de Dependencia de Clase

Esta es ordenada, pero tengo una serie de problemas con esto. No menos importante es que no tiene en cuenta las importaciones de importaciones ni los encabezados de los prefijos, ni si la clase o clases en el archivo al que hace referencia la importación se están utilizando en realidad.

Me gustaría hacer algo más parecido a class-dump y examinar los metadatos de Objective-C almacenados en el archivo Mach-O para generar una representación en memoria de las dependencias de clase.

preferiría no hacerlo desde cero, por lo que me pregunto:

  • lo tiene ya se han hecho?
  • ¿Hay una biblioteca de código abierto que me proporcione las herramientas fundamentales que necesito para extraer esta información (una biblioteca que examina el archivo Mach-O y crea una fachada de la información Objective-C contenida en él, de forma que podría iterar sobre todas las clases, sus métodos, propiedades, ivars, etc. y escanear en busca de referencias a otras clases). Me imagino que la fuente de class-dump sería un buen lugar para comenzar.
  • Si tiene experiencia en este tipo de cosas, ¿es lo que estoy tratando de lograr factible?
  • ¿Qué obstáculos debo superar?

Respuesta

3

lo tiene ya se han hecho?

No que yo sepa.

¿Existe una biblioteca de código abierto que me proporcione las herramientas fundamentales que necesito para extraer esta información?

En el núcleo de class-dump es libMachObjC que no exatly lo que quiere, es decir, todas las clases de análisis/métodos/Ivars y más. La API es muy limpia, debería ser muy fácil de usar.

Si tiene experiencia en este tipo de cosas, ¿es lo que estoy tratando de lograr factible?

Lamentablemente, no porque algunas clases no declaran la clase real, sino que usan id en su lugar. Por ejemplo, aquí está la información que se puede extraer de una clase-volcado de UIKit:

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

La información de tipo _rowData Ivar es id pero si se comprueba en tiempo de ejecución verá que _rowData es una instancia de la UITableViewRowData clase. Esta información no está presente en el binario de Mach-O, por lo que no hay manera de encontrar la relación entre UITableView y UITableViewRowData. Lo mismo aplica para los parámetros del método.

+0

¡Gracias por la respuesta! Entiendo el problema de 'id'. Sin embargo, existe una de dos posibilidades: ** A.) ** La clase real que se usa para '_rowData' no es realmente una dependencia de su clase de muestra. * o * ** B.) ** La clase real que se utiliza para '_rowData' es referenciada por uno de los métodos de su clase de muestra, en cuyo caso, el escaneo de los contenidos de todos los métodos me permitiría encontrar esa dependencia. – Steve

1

¿Ya se ha hecho?

sí - pero no puedo recomendar una buena aplicación pública

¿Hay una biblioteca de código abierto que me proporcionaría las herramientas fundamentales que necesito para extraer esta información (una biblioteca que examina el archivo Mach-O y crea una fachada de la información de Objective-C contenida en ella, de modo que pueda iterar sobre todas las clases, sus métodos, propiedades, ivars, etc. y escanear en busca de referencias a otras clases). Me imagino los volcados de clase fuente sería un buen lugar para comenzar.

la mayoría de los casos de uso se beneficiarían mediante el uso de las instalaciones de tiempo de ejecución ObjC objc/... en lugar de examinar el binario.

Si tiene experiencia en este tipo de cosas, ¿es lo que intento lograr?

sí. He hecho algo similar usando el tiempo de ejecución objc.

¿Qué obstáculos debo superar?

que depende en gran medida del nivel de detalle que desee ...tiempo de implementación si no encuentra tal implementación, pero supongo que encontrará algunas opciones si busca las funciones más esotéricas en el tiempo de ejecución objc; ¿quizás encontrarías uno en un enlace (abierto) de idioma o puente?

si termina escribiendo uno usted mismo, puede obtener clases objc registradas usando objc_getClassList, luego acceda a las propiedades/información que desee desde allí.

+0

Justin, gracias por los comentarios! No conozco ningún método objetivo de tiempo de ejecución que me permita ver qué clases se usan desde dentro de un método. Sé que puedo hacer una lista de los métodos disponibles en una clase y obtener una primera clase, pero ¿cómo sabría que la clase Foo se usó dentro de algún método? – Steve

+0

@Steve derecha. podrá obtener diseños de objetos detallados, extraer interfaces públicas y privadas, listas de protocolos, etc. (aunque los argumentos del objeto objc decaen a id en el abi), pero este enfoque no le dirá qué ocurre en la implementación. Instruments, grpof y gcov pueden ayudarte con eso. como objc es un lenguaje muy dinámico, es ideal para evaluar la ejecución de dichos tipos. si necesita ese nivel de detalle, el volcado de clases puede ser un buen punto de partida. Originalmente no tenía la impresión de que querías tantos detalles. – justin

Cuestiones relacionadas