153 votes

Est-il vrai que l'on devrait utiliser pas NSLog() sur le code de production ?

On m’a dit quelques fois sur ce même site, mais je voulais m’assurer que c’est vraiment le cas.

Je m’attendais à pouvoir Saupoudrer les appels de fonction NSLog tout au long de mon code, et que Xcode/gcc priverait automatiquement ces crie quand ma libération/Distribution bâtiment construit.

Dois-je éviter l’utilisation de ce ? Dans l’affirmative, Quelles alternatives sont plus communs entre les programmeurs expérimentés d’Objective-C ?

196voto

Marc Charbonneau Points 30464

Les macros du préprocesseur sont en effet très utile pour le débogage. Il n'y a rien de mal avec NSLog(), mais il est simple de définir votre propre fonction d'enregistrement avec de meilleures fonctionnalités. Voici celui que j'utilise, il comprend le nom du fichier et le numéro de ligne pour le rendre plus facile pour suivre les instructions de journalisation.

#define DEBUG_MODE

#ifdef DEBUG_MODE
    #define DebugLog( s, ... ) NSLog( @"<%p %@:(%d)> %@", self, [[NSString stringWithUTF8String:__FILE__] lastPathComponent], __LINE__, [NSString stringWithFormat:(s), ##__VA_ARGS__] )
#else
    #define DebugLog( s, ... ) 
#endif

Je l'ai trouvé plus facile de mettre l'intégralité de cette déclaration dans le préfixe en-tête plutôt que de son propre fichier. Vous pouvez, si vous le vouliez, construire un complexe système de journalisation en ayant DebugLog interagir avec la normale Objective-C objets. Par exemple, vous pourriez avoir une classe de log, qui écrit dans son propre journal de bord (ou base de données), et comprend une "priorité" argument vous pouvez définir au moment de l'exécution, de sorte que les messages de débogage ne sont pas affichés dans votre version, mais les messages d'erreur sont (si vous l'avez fait ce que vous pourriez faire de DebugLog(), WarningLog(), et ainsi de suite).

Oh, et garder à l'esprit #define DEBUG_MODE peut être ré-utilisé dans des endroits différents dans votre application. Par exemple, dans mon application je l'utilise pour désactiver la clé de licence de contrôles et d'autoriser uniquement l'exécution de l'application si c'est avant une certaine date. Cela me permet de distribuer un temps limité, entièrement fonctionnel bêta copie avec un minimum d'effort de ma part.

77voto

roel Points 311

Mettez ce 3 lignes à la fin de - fichier prefix.pch :

Vous n’avez pas besoin de définir quoi que ce soit dans votre projet, parce que `` est défini dans votre paramètre de build par défaut lorsque vous créez votre projet.

25voto

Matthew Schinckel Points 15596

NSLog appels peuvent être laissés dans le code de production, mais ne devraient être là pour des cas vraiment exceptionnels, ou des informations qu’il est souhaité que seront enregistrées dans le journal système.

Les applications qui jonchent le journal système sont ennuyeux et rencontré aussi peu professionnels.

23voto

ohhorob Points 6994

Je ne peux pas commenter sur Marc Charbonneau réponse, donc je vais poster cela comme une réponse.

Suite à l'ajout de la macro à votre en-tête précompilé, vous pouvez utiliser la Cible de construire des configurations de contrôle de la définition (ou le manque de définition) DEBUG_MODE.

Si vous sélectionnez l'option "Debug" configuration active, DEBUG_MODE seront définis, et la macro s'étend à l'intégralité NSLog définition.

La sélection de la "Libération" de la configuration active ne définissent DEBUG_MODE et votre NSLogging est omis de la version release.

Étapes:

  • Target > Obtenir Des Informations
  • Construire onglet
  • Recherche pour "les Macros du Préprocesseur" (ou GCC_PREPROCESSOR_DEFINITIONS)
  • Sélectionnez Configuration: Debug
  • Modifier la Définition à ce Niveau
  • Ajouter DEBUG_MODE=1
  • Sélectionnez Configuration: Release
  • confirmer DEBUG_MODE n'est pas définie en GCC_PREPROCESSOR_DEFINITIONS

si vous omettez le caractère '=' dans la définition, vous obtiendrez une erreur de la part du préprocesseur

Aussi, collez ce commentaire (ci-dessous) au-dessus de la définition de la macro pour vous rappeler où l' DEBUG_MACRO définir vient ;)

// Target > Get Info > Build > GCC_PREPROCESSOR_DEFINITIONS
// Configuration = Release: <empty>
//               = Debug:   DEBUG_MODE=1

11voto

e.James Points 51680

EDIT: La méthode posté par Marc Charbonneau, et porté à mon attention par sho, est beaucoup mieux que celui-ci.

J'ai supprimé la partie de ma réponse, qui a proposé d'utiliser une fonction vide pour désactiver la journalisation de débogage lorsque le mode est désactivé. La partie qui traite avec réglage automatique de macro préprocesseur est toujours d'actualité, donc il reste. J'ai également modifié le nom de la macro préprocesseur de sorte qu'il s'intègre mieux avec Marc Charbonneau réponse.


Pour atteindre l'automatique (et devrait) comportement dans Xcode:

Dans les paramètres du projet, aller à la "Construction" de l'onglet et sélectionnez l'option "Debug" de configuration. Trouver les "Macros du Préprocesseur", et d'ajouter une macro nommée DEBUG_MODE.

...

EDIT: Voir Marc Charbonneau, en réponse à la bonne façon d'activer et de désactiver la connexion avec l' DEBUG_MODE macro.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X