web-dev-qa-db-fra.com

Comment détecter les méthodes inutilisées et #import dans Objective-C

Après avoir longtemps travaillé sur une application iPhone, j'ai réalisé que mon code est assez sale, contenant plusieurs #import et des méthodes qui ne sont pas du tout appelées ou utiles.

Je voudrais savoir s'il existe une directive de compilation ou un moyen de détecter ces lignes de code inutiles. Xcode a-t-il un outil pour détecter cela?

98
Hectoret

Xcode vous permet de (dé) vérifier les paramètres des avertissements spécifiques du compilateur qui peuvent vous avertir de certains types de code inutilisé. (Sélectionnez le projet dans la liste source et Fichier> Obtenir des informations, puis sélectionnez l'onglet Construire.) En voici quelques-uns (qui apparaissent pour Clang et GCC 4.2 pour moi) qui peuvent être intéressants:

  • Fonctions inutilisées
  • Paramètres inutilisés
  • Valeurs inutilisées

Je ne vois aucune option pour détecter les importations inutilisées, mais c'est un peu plus simple - l'approche low-tech consiste simplement à commenter les instructions d'importation jusqu'à ce que vous obteniez une erreur/avertissement de compilation.

Les méthodes Objective-C inutilisées sont beaucoup plus difficiles à détecter que les fonctions C inutilisées car les messages sont distribués dynamiquement. Un avertissement ou une erreur peut vous indiquer que vous avez un problème potentiel, mais son absence ne garantit pas que vous n'aurez pas d'erreurs d'exécution.


Edit: Un autre bon moyen de détecter les méthodes (potentiellement) inutilisées est d'examiner la couverture du code à partir des exécutions réelles. Cela se fait généralement en tandem avec des tests unitaires automatisés, mais ce n'est pas obligatoire.

Ce billet de blog est une introduction décente aux tests unitaires et à la couverture de code en utilisant Xcode. La section sur gcov (qui ne fonctionne qu'avec le code généré par GCC, soit dit en passant) explique comment obtenir Xcode pour construire du code instrumenté qui peut enregistrer la fréquence à laquelle il a été exécuté. Si vous prenez une version instrumentée de votre application pour une rotation dans le simulateur, puis exécutez gcov dessus, vous pouvez voir quel code a été exécuté en utilisant un outil comme CoverStory (une interface graphique assez simpliste) ou - lcov (scripts Perl pour créer des rapports HTML).

J'utilise gcov et lcov pour CHDataStructures.framework et je génère automatiquement rapports de couverture après chaque validation SVN. Encore une fois, rappelez-vous qu'il n'est pas judicieux de traiter la couverture exécutée comme une mesure définitive de quel code est "mort", mais cela peut certainement aider à identifier des méthodes que vous pouvez étudier plus en détail.

Enfin, puisque vous essayez de supprimer le code mort, je pense que vous trouverez cette question SO intéressante également:

66
Quinn Taylor

Appcode a une fonction d'inspection de code qui trouve les importations et le code inutilisés.

38
patrickandroid

Nous avons utilisé du code local Ruby code, maintenant extrait dans un joyau appelé fui: https://github.com/dblock/fui

8
dB.

J'ai récemment écrit un script pour trouver les inutilisés (ou les doublons) #import déclarations: https://Gist.github.com/Orangenhain/7691314

Le script prend un fichier ObjC .m et commence à commenter chaque #import ligne tour à tour et voyant si le projet se compile toujours. Vous devrez modifier BUILD_DIR & BUILD_CMD.

Si vous utilisez une commande find pour laisser le script s'exécuter sur plusieurs fichiers, assurez-vous d'utiliser un BUILD_CMD qui en fait utilise tous ceux fichiers (ou vous verrez un fichier avec beaucoup d'instructions d'importation inutilisées).

J'ai écrit ceci sans savoir que AppCode a une fonctionnalité similaire, mais quand j'ai testé AppCode, il n'était pas aussi complet que ce script (mais beaucoup plus rapide [pour un projet entier]).

5
Orangenhain

Comme paddydub l'a dit, AppCode le fait très bien. J'ai essayé et cela ne m'a pris que 10 minutes:

Aller à Code > Optimize Imports..., ou ^ + ⌥ + O

Voici une vidéo décrivant comment faire cela: Détection de l'importation et des méthodes inutilisées dans AppCode

2
Erzékiel

Vous pouvez utiliser Xcode Analyzer pour trouver cela et d'autres problèmes.

http://help.Apple.com/xcode/mac/8.0/#/devb7babe82

Vous pouvez également accéder au projet et à la génération cible et ajouter des préférences d'avertissement de modification sous les paramètres de génération. Voir ce guide:

http://oleb.net/blog/2013/04/compiler-warnings-for-objective-c-developers/

2
sivi

Récemment, j'ai changé un grand projet de Carbon à Cocoa. À la fin de cela, il y avait pas mal de fichiers orphelins qui n'étaient plus utilisés. J'ai écrit un script pour les trouver qui a essentiellement fait ceci:

Assurez-vous que la source est entièrement archivée dans Subversion (c.-à-d. Propre) source et le fichier d'en-tête, essayez une construction, si elle échoue, restaurez les fichiers, sinon, laissez-les vides.

Après avoir exécuté cela, rétablissez puis supprimez tous les fichiers vidés, compilez puis supprimez tous les #imports en erreur.

Je dois également ajouter que vous devez éviter les fichiers référencés à partir de fichiers .xib ou .sdef, et il peut y avoir d'autres cas de liaison dynamique, mais cela peut toujours vous donner une bonne idée de ce qui peut être supprimé.

La même technique peut être utilisée pour voir quels # importations peuvent être supprimés - au lieu de tronquer le fichier, supprimez chaque #import dans le fichier à son tour et voyez si la construction échoue.

1
Peter N Lewis