Ce gars est venu avec un joli outil soigné pour générer un graphique de dépendance de classe - cependant, il s'appuie sur l'analyse de votre code source et recherchez des directives C'est soigné, mais j'ai un certain nombre de problèmes avec cela. Cela ne tient pas moins compte que cela ne tient pas compte des importations des importations ni des en-têtes de préfixes ni de la classe (ES) du fichier référencé par l'importation sont réellement utilisés. p>
J'aimerais faire quelque chose de plus proche de Je préférerais ne pas faire cela à partir de zéro, alors je me demande: p>
#Import code>. p>
Classe-Dump CODE> et examiner les métadonnées de l'objectif-C stockées dans le fichier MAC-O pour générer une représentation en mémoire des dépendances de la classe. p>
3 Réponses :
a-t-il déjà été fait? p> blockQuote>
Oui - mais je ne peux pas recommander une bonne implémentation publique p>
Y a-t-il une bibliothèque open source qui me fournirait les outils fondamentaux dont j'ai besoin pour extraire ces informations (une bibliothèque qui examine le fichier MACH-O et crée une façade des informations de l'objectif-C contenues dans - telle que je pourrait parcourir toutes les classes, leurs méthodes, leurs propriétés, leurs propriétés, des ivars, etc. et une analyse des références à d'autres classes) I Figure CLASS-Dump's Source serait un bon endroit pour commencer. P> blockQuote>
La plupart des cas d'utilisation bénéficieraient en utilisant l'OBJC Runtime Installations
Objc /...< / Code> Plutôt que d'examiner le binaire. P>
Si vous avez de l'expérience dans ce genre de chose, c'est ce que j'essaie d'accomplir réalisable? P> blockQuote>
oui. J'ai fait quelque chose de similaire à l'aide du runtime Objc. P>
Quels barrages routiers devrai-je surmonter? P> blockQuote>
Cela dépend en grande partie du niveau de détail que vous souhaitez ... Temps de mise en œuvre Si vous ne trouvez pas de ce type de mise en œuvre, mais je pense que vous trouverez quelques options si vous Google les fonctions plus ésotériques dans l'OBJC Runtime; Peut-être que vous en trouveriez un dans une liaison ou un pont (ouvert) de langue? p>
Si vous finissez par écrire un vous-même, vous pouvez obtenir des classes OBJC enregistrées à l'aide de
objc_getclasslist code>, puis accédez aux propriétés / informations que vous souhaitez à partir de là. P>
Justin, merci pour les commentaires! Je ne suis au courant d'aucune méthode d'exécution de l'objectif C qui me laissera voir quelles classes sont utilisées à l'intérieur d'une méthode. Je sais que je peux énumérer les méthodes disponibles sur une classe et obtenir une CLST de cours, mais comment saurais-je savoir que la classe FOO a été utilisée dans une méthode?
@Steve Droite. Vous serez en mesure d'obtenir des dispositions détaillées d'objet, d'extraire des interfaces publiques et privées, des listes de protocoles, etc. (bien que les arguments d'objet Objc soient décomposés à l'ID dans l'ABI), mais cette approche ne vous dira pas ce qui se passe dans la mise en œuvre. Les instruments, GRPOF et GCOV peuvent vous aider avec cela. Depuis que l'Objc est une langue très dynamique, il est idéal pour évaluer l'exécution de tels types. Si vous avez besoin de ce niveau de détail - le décharge de classe peut être un bon point de départ. Je n'ai pas été à l'origine sous l'impression que vous vouliez avoir beaucoup de détails.
a-t-il déjà été fait? p>
pas que je connaisse. P>
Y a-t-il une bibliothèque open source qui me fournirait le Outils fondamentaux J'ai besoin d'extraire cette information? P> blockQquote>
au cœur de CLASS-Dump est
libmachobjc Code> qui fait exactement ce que vous voulez, c'est-à-dire analyser toutes les classes / méthodes / ivars et plus encore. L'API est très propre, il devrait être très facile à utiliser. P>
Si vous avez de l'expérience dans ce genre de chose, c'est ce que j'essaie de accomplir réalisable? P> BlockQuote>
Malheureusement, non, car certaines classes ne déclarent pas la classe réelle mais utilisent
ID code>. Par exemple, voici les informations pouvant être extraites à partir d'une vidage de classe d'Uikit: p>
xxx pré>
_rowdata code> Les informations de type ivar sont
ID code> Mais si vous vérifiez au moment de l'exécution, vous verrez que
_rowdata code> est une instance de la classe
utableviewowdata code>. Ces informations ne sont pas présentes dans le Binary Mach-O, vous n'avez donc aucun moyen de trouver la relation entre
utableview code> et
utableviewrowdata code>. La même chose s'applique aux paramètres de la méthode. P> blockQquote>
Merci pour la réponse! Je comprends le problème id code>. Cependant, une des deux possibilités existe: a.) B> La classe actuelle utilisée pour
_rowdata code> n'est pas une dépendance de votre classe d'échantillons. ou i> b.) b> La classe actuelle utilisée pour
_rowdata code> est référencée par l'une de vos méthodes de votre classe d'échantillons - dans quel cas, numérisation du contenu de toutes les méthodes me permettraient de trouver cette dépendance.
Voici une solution qui repose sur des informations dans les fichiers Mach.o et génère une dépendance graphique basée sur ces informations: https://github.com/pultaykalo/objc-dependency-visualizer P>