Est-il vrai que l'on ne devrait pas utiliser NSLog() sur la production de code?
M'a dit à quelques reprises dans ce site, mais je voulais m'assurer que c'est vraiment le cas.
Je m'attendais à être en mesure de les arroser NSLog appels de fonction tout au long de mon code, et que Xcode/gcc serait automatiquement la bande de ceux des appels lors de la construction de ma Libération/Distribution s'appuie.
Devrais-je éviter l'utilisation de ce? Si oui, quelles sont les alternatives les plus courantes entre ce qui est vécu Objective-C programmeurs?
- Je sais que cette question est maintenant très vieux, mais, si vous le pouvez encore, je marque Marc Charbonneau réponse acceptée. J'ai modifié ma réponse au point à la sienne, mais sa réponse est la bonne.
- NSLog() à l'intérieur d'une fréquente de la boucle sera absolument meurtre de votre performance, il a dit, après avoir découvert la manière dure.
Vous devez vous connecter pour publier un commentaire.
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.
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.NSLog()
dans le code de production. Flagrant utilisation deNSLog()
peut engager de façon significative l'utilisation de la mémoire hit (lots o' autoreleased de chaînes de caractères) et de cycle du PROCESSEUR hit (lots o' analyse, mise en forme, et de l'octet de copie). Vous absolument ne pas envie d'assumer ces coûts dans un environnement de production, surtout pas sur un dispositif intégré!Mettre ce 3 lignes à la fin du préfixe.pch fichier:
Vous n'avez pas besoin de définir quoi que ce soit dans votre projet, car
DEBUG
est défini dans votre configuration par défaut lorsque vous créez votre projet.NSLog les appels peuvent être laissés dans le code de production, mais ne devrait être là que pour des cas vraiment exceptionnels, ou de l'information qu'il est désiré qui sera enregistré dans le journal système.
Applications qui jonchent le journal système sont ennuyeux, et viennent à travers comme un manque de professionnalisme.
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) la
DEBUG_MODE
.Si vous sélectionnez "Debug" configuration active,
DEBUG_MODE
seront définis, et la macro s'étend à la totalitéNSLog
définition.La sélection de la "Libération" configuration active ne sera pas définir
DEBUG_MODE
et votreNSLog
ging est omis de la version release.Suit:
GCC_PREPROCESSOR_DEFINITIONS
)DEBUG_MODE=1
DEBUG_MODE
n'est pas définie dansGCC_PREPROCESSOR_DEFINITIONS
si vous omettez le caractère '=' dans la définition, vous obtiendrez une erreur de le préprocesseur
Aussi, collez ce commentaire (ci-dessous) au-dessus de la définition de la macro pour vous rappeler où la
DEBUG_MACRO
définir vient 😉DEBUG_MODE
etDEBUG_MACRO
sont non conventionnelles. Je n'en ai trouvé une référence àDEBUG_MACRO
sur le site d'apple (opensource.apple.com/source/gm4/gm4-15/src/m4.h?txt). Peut-être le plus standardDEBUG
etNDEBUG
seraient de meilleurs choix?NDEBUG
est spécifiée par Posix, tandis queDEBUG
est utilisé par convention.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" de la section, et ajouter une macro nommée
DEBUG_MODE
....
EDIT: Voir Marc Charbonneau réponse pour la bonne façon d'activer et de désactiver la connexion avec le
DEBUG_MODE
macro.Je suis d'accord avec Matthieu. Il n'y a rien de mal avec NSLog dans le code de production. En fait, il peut être utile à l'utilisateur. Cela dit, si la seule raison pour laquelle vous êtes à l'aide de NSLog est de vous aider à déboguer, alors, oui, qui doit être retiré avant de vous libérer.
En outre, depuis que vous avez marqués ce qu'un iPhone question, NSLog prend des ressources, qui est quelque chose que l'iPhone a peu de. Si vous êtes NSLogging rien sur l'iPhone, qui emporte le temps du processeur à partir de votre application. Utiliser à bon escient.
La simple vérité est que NSLog est tout simplement lent.
Mais pourquoi? Pour répondre à cette question, voyons ce qu'NSLog, puis comment il le fait.
Ce n'NSLog faire exactement?
NSLog fait 2 choses:
Il écrit les messages du journal de la Pomme Système d'enregistrement (asl) et de l'installation. Cela permet aux journaux de messages à afficher dans la Console.app.
Il vérifie également si l'application du flux stderr est d'aller dans un terminal (comme lorsque l'application est en cours d'exécution via Xcode). Si donc il écrit le journal message sur stderr (de sorte qu'il s'affiche dans la console de Xcode).
Écrit sur la sortie STDERR n'a pas l'air difficile. Qui peut être accompli avec fprintf et le stderr descripteur de fichier de référence. Mais qu'en asl?
Le meilleur de la documentation que j'ai trouvé à propos de l'ASL est de 10 blog de Pierre Hosey: lien
Sans entrer dans trop de détails, le point culminant (le concerne, de performance) est-ce:
Pour envoyer un message de log de l'ASL installation, fondamentalement, vous ouvrez un client de connexion à l'ASL démon et envoyer le message. MAIS - chaque thread doit utiliser une connexion client. Donc, pour être thread-safe, à chaque fois NSLog est appelée, elle ouvre une nouvelle asl de connexion du client, envoie le message, et puis ferme la connexion.
Ressources pourrait être trouvé ici & ici.
Comme indiqué dans d'autres réponses, vous pouvez utiliser un #define modifier si NSLog est utilisé ou non au moment de la compilation.
Cependant d'une manière plus souple consiste à utiliser une bibliothèque de journalisation comme Cacao Bûcheron thatallows vous changer si quelque chose est connecté à l'exécution.
Dans votre code remplacer NSLog par DDLogVerbose ou DDLogError etc, ajouter un #import pour les définitions de macro etc et installation d'enregistreurs de, souvent dans le applicationDidFinishLaunching méthode.
Avoir le même effet que NSLog le code de configuration est
À partir d'un point de vue sécurité, il dépend de ce qui est enregistré. Si
NSLog
(ou autres enregistreurs) est l'écriture des informations sensibles, vous devez supprimer l'enregistreur de données dans le code de production.À partir d'un audit de point de vue, l'auditeur n'a pas envie de regarder chaque utilisation de
NSLog
pour assurer sa enregistre pas d'informations sensibles. Il/elle sera tout simplement dire que vous retirez de l'enregistreur.Je travaille avec les deux groupes. Nous l'audit de code, écrire le codage des guides, etc. Notre guide exige que l'enregistrement est désactivé dans le code de production. Donc les équipes internes ne sais pas à l'essayer 😉
Nous allons également rejeter une app externe qui se connecte pour la production parce que nous ne voulons pas accepter le risque associé à l'accidentellement fuite d'informations sensibles. Nous ne se soucient pas ce que le développeur nous le dit. Son tout simplement pas digne de notre temps à étudier.
Et rappelez-vous, nous définissons la "sensibles", et non le développeur 😉
J'y perçois également une application qui effectue beaucoup de journalisation comme une application prête à imploser. Il y a une raison tellement l'exploitation forestière est effectuée besoin, et son habitude de ne pas la stabilité. Ses juste là-haut avec 'chien de garde' threads que le redémarrage des services bloqués.
Si vous n'avez jamais été à travers une Architecture de Sécurité (SecArch) d'examiner, ce sont les sortes de choses que nous cherchons.
Vous ne devriez pas être inutilement verbeux avec printf ou NSLog dans la version du code. Essayez seulement de faire un printf ou NSLog si l'application a quelque chose de mal se passer, I. E. une erreur irrécupérable.
Gardez à l'esprit que NSLogs peut ralentir l'INTERFACE utilisateur /thread principal. Il est préférable de les supprimer de release, sauf si absolument nécessaire.
Je vous recommande fortement de l'aide de TestFlight pour l'enregistrement (gratuit). Leur méthode remplace NSLog (à l'aide d'une macro) et vous permettent d'activer/désactiver la journalisation pour leur serveur, le Système d'Apple journal et STDERR journal, pour tous vos appels vers NSLog. La bonne chose à ce sujet est que vous pouvez toujours vérifier vos messages de journal pour les applications déployées pour les testeurs et les applications déployées dans l'App Store, sans les journaux qui apparaissent sur le système de l'utilisateur du journal. Le meilleur des deux mondes.