Mise à jour pour Xcode 5 et iOS 7
note : pour un Xcode 7 / Swift 2.1 solution pour éliminer print() dans un build de version, trouver ma réponse aquí .
Oui, vous devez supprimer toute déclaration NSLog dans votre code de version, car elle ne fait que ralentir votre code, et n'est d'aucune utilité dans une version de version. Heureusement, dans Xcode 5 (iOS 7), il est étonnamment simple de supprimer toutes les déclarations NSLog "automatiquement" dans les versions release. Alors pourquoi ne pas le faire.
D'abord les 3 étapes à suivre, puis quelques explications
1) Dans votre projet Xcode, localisez le fichier 'yourProjectName-prefix.pch' (normalement, vous le trouverez dans le groupe 'supporting files', où se trouve votre fichier main.m).
2) ajouter ces 3 lignes à la fin du fichier '.pch' :
#ifndef DEBUG
#define NSLog(...);
#endif
3) testez la différence entre votre version 'debug' et 'release'. Une façon de le faire est de passer par 'edit scheme' -> 'run app name' -> sous l'onglet 'info' sélectionnez en utilisant la boîte déroulante entre debug et release. Dans la version release, vous ne verrez pas de sortie NSLog dans la console de débogage !
Comment tout cela fonctionne-t-il ?
Tout d'abord, il faut savoir qu'un préprocesseur est relativement "bête", et agit simplement comme un "substitut de texte" avant que le compilateur ne soit appelé. Il remplace tout ce que vous "#definez" par ce qui suit la balise #define
déclaration.
#define NSLog(...);
El (...)
signifie "tout" entre les crochets (). Pensez aussi au ;
à la fin. Ce n'est pas strictement nécessaire car le compilateur l'optimisera, mais j'aime bien le mettre là, car c'est plus "correct". Après notre #define
il n'y a rien, donc le préprocesseur le remplacera par "rien", et donc il jettera la ligne complète, en commençant par NSLog...
jusqu'à et y compris le ;
.
Les déclarations de définition peuvent être rendues conditionnelles en utilisant #ifdef
(si elle est définie) ou #ifndef
(si non défini)
ici nous écrivons #ifndef DEBUG
ce qui signifie "si le symbole DEBUG n'est pas défini". Le site #ifdef
o #ifndef
doivent être "fermés" avec #endif
Xcode 5 définit par défaut le symbole 'DEBUG' pour nous lorsque le mode de construction est 'DEBUG'. En 'release', il n'est pas défini. Vous pouvez le vérifier dans les paramètres de votre projet, onglet 'Build settings' -> descendez jusqu'à la section 'Apple LLVM 5.0 - Preprocessing' -> macros du préprocesseur. Vous verrez que le symbole 'DEBUG' n'est pas défini pour les builds release !
enfin, le fichier .pch est créé automatiquement par Xcode, et automatiquement inclus dans chaque fichier source lors de la compilation. Ainsi, c'est comme si vous aviez mis tout le fichier .pch dans le fichier source. #define
dans chacun de vos fichiers sources.
1 votes
Dans mon projet actuel, j'utilise UALogger . Il s'agit de ne se connecte pas à la production si vous ne le demandez pas explicitement. Et a d'autres avantages par rapport à NSLog ordinaire, comme les niveaux de gravité (avec DEBUG , INFO etc) hors de la boîte. Bon travail !
1 votes
Pour répondre à votre question sur "le rendement sera-t-il meilleur ?" Oui, c'est le cas, mais le rendement que vous obtenez dépend du nombre d'heures de travail.
NSLog()
que vous avez à travers votre application.NSLog()
prend du temps à s'exécuter et ajoute des frais supplémentaires au temps d'exécution de votre application. Quoi qu'il en soit, si une simple macro de préprocesseur DEBUG permet d'améliorer les performances, nous devrions la désactiver.0 votes
Je dirais également que si vous avez beaucoup d'instructions NSLog/print dans votre code, cela pourrait suggérer que vous devriez passer un peu de temps à en apprendre davantage sur le débogueur. Je fixe régulièrement des points d'arrêt qui impriment les informations qui m'intéressent, et continuent automatiquement. Oui, cela peut ralentir un peu l'exécution, mais dans la plupart des cas, ce n'est pas accablant. De même, les pauses conditionnelles vous permettent d'enquêter lorsque quelque chose d'inattendu se produit.