o CGPoint , ad esempio. La syntaxe NSLog(@"%@", ... ); qui fonctionne et est utilisé pour obtenir des informations sur les objets, mais ne fonctionne pas sur les types de données tels que C struct CGRect ou CGPoint , par exemple. o NSStringFromCGPoint : Pour profiter de NSLog(@"%@", ... ); également de style C structs nous pouvons nous appuyer sur les fonctions de conversion telles que NSStringFromCGRect() ou NSStringFromCGPoint :
1 2 3 4 5
| CGRect ) { 10 , 20 , 30 , 40 } ; CGRect mioRect = (CGRect) {10, 20, 30, 40}; CGPoint ) { 32 , 64 } ; CGPoint mioPoint = (CGPoint) {32, 64}; / / "Info rettangolo: %@" , NSStringFromCGRect ( mioRect ) ) ; NSLog (@ "rectangle Info:% @", NSStringFromCGRect (mioRect)); "Info point: %@" , NSStringFromCGPoint ( mioPoint ) ) ; NSLog (@ "point info:% @", NSStringFromCGPoint (mioPoint)); |
Plus précisément, il est possible d'affiner les procédures correspondantes de petites macros utiles comme:
1
| # Définir NSLogRect (rect) NSLog (@ "% s (% 0.0f, 0.0f%) 0.0f%% 0.0fx", # rect, rect.origin.x, rect.origin.y, rect.size.width , rect.size.height) |
Ou:
1 2 3 4
| # Définir NSLogCGPoint (point) NSLog (@ "% s (% 0.0f, 0.0f%)", # Point.X point, Point.y)
CGPoint ) { 32 , 64 } ; CGPoint mioPoint = (CGPoint) {32, 64}; ; NSLogCGPoint (mioPoint); |
Cela vous donnera en sortie:
1
| 32 , 64 ) mioPoint: (32, 64) |
En savoir plus ...
<a target="_blank" href="http://developer.apple.com/iphone/library/documentation/Cocoa/Reference/Foundation/Miscellaneous/Foundation_Functions/Reference/reference.html#//apple_ref/c/func/NSLog">NSLog()</a> une fonction utile durant les premiers stades d'un projet pour tester et déboguer une application pour iPhone d'Apple ou, plus généralement, dans un environnement XCode. Etre juste une fonction, tout comme l'autre, sa présence se fera sentir, même lors de la libération (release) de notre exécutable. potrebbero influire sulle performance della nostra applicazione, soprattutto se abbiamo inserito NSLog() all'interno di loop. Il devient donc nécessaire de retirer, d'une certaine façon, toutes les lignes de NSLog() à partir de notre code, car il n'est pas nécessaire, soit parce que les appels à NSLog() pourrait affecter la performance de notre application, surtout si nous mettons NSLog() pour «boucle interne.
Immédiatement écarter la solution à la «look» et «Annuler», parce qu'un jour il pourrait être utilisé à nouveau. Nous excluons aussi la solution du «look» et «commentaires», inconfortables pour la même raison que précédemment. Heureusement, un propre, simple et sont conditionnels à l'aide des compilateurs correctes. Ce que nous faisons dans la pratique, et dire au compilateur d'exclure - s'il ya une condition spécifique - lors de la compilation de nos lignes de source qui contiennent NSLog() .
Les compilations de directives et instructions du compilateur conditionnelle, sont un outil très puissant et très répandue. Ceux qui viennent de l'élaboration de la norme ANSI-C savez certainement très bien et utilizzte dans de nombreuses situations. La particularité de ces «instructions» réside dans le fait, mentionné ci-dessus, pour être vu par le compilateur et non exécutable. Cette caractéristique les rend utiles dans de nombreux cas et peut résoudre les problèmes par ailleurs très ennuyeux.
Voyons un exemple de code qui, comme prévu, vous pouvez "supprimer" en compilant des morceaux de code, dans notre cas NSLog() :
1 2 3 4 5 6
| # Définir une ACTIVE_NSLOG / / Si la constante est définie ACTIVE_NSLOG remplir / / Bloc de code entre # ifdef et # endif # Ifdef ACTIVE_NSLOG " ... bla bla" ) ; NSLog (@ "... bla bla"); # Endif |
). Les instructions conditionnelles font partie du compilateur de la même famille que #define , aussi, en fait, sont précédés d'un "livre" ( # ). solo se ACTIVE_NSLOG è definito. Dans l'exemple montré que nous avons défini une constante ACTIVE_NSLOG ; les lignes suivantes de code indique au compilateur de ligne "include" NSLog() que si ACTIVE_NSLOG est défini. Si nous avons pris soin, lors de la rédaction de notre code, insérant des appels à NSLog() dans le bloc #ifdef ... #endif per far sparire, alla prossima compilazione, tutti i nostri NSLog() . #ifdef ... #endif , il suffit de supprimer la définition de la constante ACTIVE_NSLOG à s'estomper, la prochaine compilation, toute notre NSLog() .
Meilleure A et définitive
Voyons maintenant comment configurer l'environnement XCode pour améliorer encore plus ce que nous avons fait ici! D'abord nous choisissons un nom de constante que nous utilisons dans nos projets visant à exclure de la compilation NSLog() . o quello che preferite. Vous pouvez choisir le nom que vous voulez, à partir de DEBUG à MIO_DEBUG ou ce que vous préférez. Ouvrez votre projet, neuf ou ancien. Entrez toutes les NSLog() dans le bloc (ou d'un bloc):
1 2 3
| # Ifdef MIO_DEBUG " ... bla bla" ) ; NSLog (@ "... bla bla"); # Endif |
Sélectionnez le fichier principal de votre projet, faites un clic droit et choisissez l'Get Info.

Cela ouvre une fenêtre avec des informations sur le projet:

Sélectionnez l'onglet Générer, vérifier que vous êtes en configuration Debug (ce qui est le joyau), aller à la section utilisateur et d'ajouter, via le bouton en bas à gauche, un nouveau champ appelé OTHER_CFLAGS . A ce assegnamoli la valeur -DMIO_DEBUG=1 . La syntaxe est -D{mia define}=1 .
Cette procédure présente deux avantages:
- Nous ne devons pas mettre dans le code
#define MIO_DEBUG 1 , mais nous le faisons à travers l'information du projet. Donc, quand nous allons à remplir la version (l'un sans l' NSLog() ) nous devons nous rappeler de supprimer la ligne #define MIO_DEBUG 1 - La constante est définie par rapport à la configuration, dans notre Déboguer cas. Puis, passant à la configuration de sortie (communiqué) sera absent et les lignes constantes avec
NSLog() ne sera pas compilé
Conclusions
La procédure ci-dessus peut être utile dans certains cas moltidutine autres, avec NSLog() , n'ont rien à voir. Les instructions conditionnelles peuvent aider le compilateur dans un large éventail de contextes. Ils sont souvent utilisés par les programmeurs pour déterminer le type de version du système d'exploitation, la cible, la présence de processeurs mathématiques, tout en conservant la même "identique" source.
Pour comprendre cela, à titre d'exemple, nous pouvons utilizzre notre constante MIO_DEBUG aussi d'intervenir dans d'autres domaines du code:
1 2 3 4 5 6 7 8 9 10
| / / Debug s'ils gagnent le match / / Avec un score de 100 au lieu de 10000 :) # Ifdef MIO_DEBUG score == 100 ) if (score de == 100) # Else score == 10000 ) if (score de == 10000) # Endif { ; [HaiVinto auto]; } |
Pour finir, voici quelques exemples et des variantes:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| / / Plus généralement existe l' # Si l'expression / / Si la déclaration semblable à la traditionnelle, donc avec une pleine expression
/ / Vérifier si une constante est définie # Ifdef constante
/ / Vérifier si elle n'est pas une constante définie # Ifndef constante
/ / Else # Else
/ / Fermeture du bloc # Endif |
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| / / Par exemple ... # Define DEBUG 1 # Définir MIA_ALTRA_COSTANTE 5
... # Si DEBUG / / Remplissez ce # Else / / Sinon combler cette autre # Endif
# Si MIA_ALTRA_COSTANTE> 4 "..." ) ; NSLog (@ "..."); # Endif |
1 2 3 4
| # Ifndef INCLUDE_MIO_FILE # Définir INCLUDE_MIO_FILE # Include "mio_file.h" # Endif |
En savoir plus ...
, usata per il debug delle applicazioni. Reprenant le poste à partir d'ActionScript à l'Objective-C (où vous mettez le code et en comparant la syntaxe ActionScript et Objective-C) en Actionscript, nous avons la fonction pratique trace ( ) , utilisée pour les applications de débogage. Cette fonction fournit en sortie une sortie à l'environnement de la console d'Adobe le développement Flash plus. Il est principalement utilisé au cours du développement et le test de "film" / application. Dans XCode / Objective-C, nous avons: NSLog ( ) . di Actionscript: La syntaxe de cette fonction est très similaire à la trace ( ) en Actionscript:
1
| "Sono una linea di debug" ) ; NSLog (@ "je suis une ligne debug"); |
Dans ActionScript, nous avons:
1
| "Sono una linea di debug" ) ; trace ("Je suis une ligne debug"); |
Outre l'utilisation du signe (@), comme vous pouvez le voir, sont identiques. Les différences et les similitudes () démarre lorsque vous souhaitez afficher les valeurs des variables, par exemple en Actionscript, nous avons:
1 2 3
| "Coordinata x:" + x + " coordinata y:" + y ) ; de trace ("x-de coordonnées:" + x + "coordonnée y:" + y); / / Ou "Coordinate: " , x , y ) ; trace ("coordonnées", x, y); |
En Objective-C, nous avons:
1
| "Coordinata x:%i coordinata y:%i" , x, y ) ; NSLog (@ "x-de coordonnées: l'% y% de coordonnées i", x, y); |
che opera sull'Apple System Log. Remarque: NSLog() appelle en fait la fonction plus générique NSLogv ( ) qui fonctionne sur système Apple Connexion. Les fonctions sont en fait identiques, en changeant seulement les paramètres d'entrée.
o sprintf ( ) . Les développeurs C trouverez très familier avec la mise en forme de chaînes, comme avec printf ( ) ou sprintf ( ) . Pour plus de détails, voir de spécificateurs de format de chaîne .
En savoir plus ...
Derniers Commentaires
Marquez : Merci beaucoup, je l'ai allumé
Je l'ai résolu par la mise en [cc_objc] / / OptionViewController.m - ...
Giovambattista Fazioli : @ Mark: Je vous suggère de réfléchir une approche plus correcte. Si vous exécutez la sous-classe de l'onglet ...
Mark : Excusez le spam .. J'ai remarqué qu'il ya une erreur .. voici la correction [cc_objc] / PrimaClasse.h **** / # import ...
Marco : oubliée .. dans [cci] OptionViewController [/ cci] pour [cci] @ syntetize [/ cci] J'ai mis le délégué
louis : très clair et simple, je dois avouer que rédiger un an à peine utiliser des délégués créés par ...