Est-il possible de NSLog C Structs (comme CGRect ou CGPoint)?

413

Je veux pouvoir déboguer les structures C sans avoir à taper explicitement toutes les propriétés qui les composent.

c'est-à-dire que je veux pouvoir faire quelque chose comme ça:

CGPoint cgPoint = CGPointMake(0,0);
NSLog(@"%@",cgPoint);

De toute évidence, le '% @' ne fonctionnera pas, d'où la question.

mazniak
la source
2
NSLog (@ "% @", CGRectCreateDictionaryRepresentation (rect));
Abhishek Bedi
Essayez LOG_EXPR à partir de la bibliothèque VTPG_Common: vgable.com/blog/tag/log_expr
LearnCocos2D

Réponses:

806

Vous pouvez essayer ceci:

NSLog(@"%@", NSStringFromCGPoint(cgPoint));

Il existe un certain nombre de fonctions fournies par UIKit qui convertissent les différentes structures CG en NSStrings. La raison pour laquelle cela ne fonctionne pas est parce qu'il %@signifie un objet. A CGPointest une structure C (tout comme CGRects et CGSizes).

Alex
la source
7
Avec AppKit sur OS X, vous devez convertir en NSPointpuis appeler NSStringFromPoint. Par exemple:NSStringFromPoint(NSPointFromCGPoint(point))
Alex
19
NSLog (@ "% @", CGRectCreateDictionaryRepresentation (rect));
Abhishek Bedi
Similaire aux préfixes UI, MK, CL qui, bien que tous aient une signification et doivent importer un fichier .h respectif comme: UIKit, MapKit, CoreLocation; Le préfixe CG signifie-t-il que je devrais importer quelque chose? Si ce n'est pas juste une convention de dénomination?!
Honey
231

Il y a quelques fonctions comme:

NSStringFromCGPoint  
NSStringFromCGSize  
NSStringFromCGRect  
NSStringFromCGAffineTransform  
NSStringFromUIEdgeInsets

Un exemple:

NSLog(@"rect1: %@", NSStringFromCGRect(rect1));
Steve
la source
4
Ce sont les: "chose unique dans tout le développement iOS qui est la plus utile mais la moins connue" !! Heh
Fattie
7
Remarque: pour le développement de Cocoa (OS X), ces fonctions n'ont pas "CG" dans le nom.
peterflynn
17
NSLog(@"%@", CGRectCreateDictionaryRepresentation(rect));
Abhishek Bedi
la source
13

J'utilise la macro suivante pour m'aider avec NSRect:

#define LogRect(RECT) NSLog(@"%s: (%0.0f, %0.0f) %0.0f x %0.0f",
    #RECT, RECT.origin.x, RECT.origin.y, RECT.size.width, RECT.size.height)

Vous pouvez faire quelque chose de similaire pour CGPoint:

@define LogCGPoint(POINT) NSLog(@"%s: (%0.0f, %0.0f)",
    #POINT POINT.x, POINT.y);

L'utiliser comme suit:

LogCGPoint(cgPoint);

Produirait ce qui suit:

cgPoint: (100, 200)
e.James
la source
6
Pourquoi ne pas simplement utiliser les fonctions de conversion de chaîne UIKit intégrées ?
ma11hew28
Je le fais maintenant. Ce sont exactement les fonctions qu'Alex et Steve ont affichées dans leurs réponses.
e.James
1
Vaut-il la peine d'éditer la réponse et d' ajouter une note en haut "Pour un intérêt historique seulement ...". Je fais toujours cela, par exemple stackoverflow.com/questions/402/iphone-app-in-landscape-mode/… stackoverflow.com/questions/5492479/… stackoverflow.com/questions/4212628/… ( "Il vaut la peine de noter que ce billet de la décennie précédente n'a vraiment qu'un intérêt historique. " ) etc
Fattie
1
Cette réponse est toujours utile, malgré l'existence de fonctions de conversion UIKit, car il existe d'autres structures dans d'autres frameworks, qui n'ont pas d'aides NSStringFrom (par exemple. MKCoordinateRegion).
Greg Bell
10

Vous pouvez utiliser NSValuepour cela. Un objet NSValue est un simple conteneur pour un seul élément de données C ou Objective-C. Il peut contenir n'importe quel type scalaire tel que int, float et char, ainsi que des pointeurs, des structures et des identifiants d'objet.

Exemple:

  CGPoint cgPoint = CGPointMake(10,30);
    NSLog(@"%@",[NSValue valueWithCGPoint:cgPoint]);

PRODUCTION : NSPoint: {10, 30}

J'espère que cela vous aide.

Nishant Tyagi
la source
Merci @Nishant - nécessaire pour sortir le contenu d'un CMTimeRange et cela a fait l'affaire. Beaucoup plus de possibilités que NSStringFrom ...
amergin
5

Puisque le RSS cassé de Stack Overflow vient de ressusciter cette question pour moi, voici ma solution presque générale: JAValueToString

Cela vous permet d'écrire JA_DUMP(cgPoint)et de vous cgPoint = {0, 0}connecter.

Jens Ayton
la source
J'ai fait ça et j'ai eu une erreur de compilation. Parfois, l'adresse de l'expression de la propriété est requise ou quelque chose
user4951
@Jim Thio: la macro est configurée de telle manière que l'objet inspecté doit être une valeur l. (Je ne me souviens pas pourquoi; quelque chose sur le fait de ne pas pouvoir gérer correctement les chaînes C autrement.) En bref, affectez votre propriété à une variable temporaire, puis appelez JA_DUMP à ce sujet.
Jens Ayton
5

Oui, vous pouvez utiliser quelques fonctions comme ci-dessous: Vous devez d'abord convertir la structure CGPoint en chaîne, voir l'exemple

1) NSStringFromCGPoint,  
2) NSStringFromCGSize,  
3) NSStringFromCGRect,  
4) NSStringFromCGAffineTransform,  
5) NSStringFromUIEdgeInsets,

Par exemple:

1) NSLog(@"NSStringFromCGPoint = %@", NSStringFromCGRect(cgPointValue));

Comme ça...

Vaibhav Shiledar
la source
2
NSLog(@"%@",CGRectCreateDictionaryRepresentation(rect));
UdayM
la source