È possibile NSLog C Struct (come CGRect o CGPoint)?


413

Voglio essere in grado di eseguire il debug delle strutture C senza dover digitare esplicitamente tutte le proprietà in cui sono costituite.

cioè voglio essere in grado di fare qualcosa del genere:

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

Ovviamente "% @" non funzionerà, quindi la domanda.


2
NSLog (@ "% @", CGRectCreateDictionaryRepresentation (rect));
Abhishek Bedi,

Prova LOG_EXPR dalla libreria VTPG_Common: vgable.com/blog/tag/log_expr
LearnCocos2D

Risposte:


806

Puoi provare questo:

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

Esistono numerose funzioni fornite da UIKit che convertono le varie strutture CG in NSStrings. Il motivo per cui non funziona è perché %@indica un oggetto. A CGPointè una struttura C (e così sono CGRects e CGSizes).


7
Con AppKit su OS X dovresti convertirlo in un NSPointe poi chiamare NSStringFromPoint. Ad esempio:NSStringFromPoint(NSPointFromCGPoint(point))
Alex,

19
NSLog (@ "% @", CGRectCreateDictionaryRepresentation (rect));
Abhishek Bedi,

Simile ai prefissi UI, MK, CL che pur avendo tutti un significato e che devono importare un rispettivo file .h come: UIKit, MapKit, CoreLocation; Il prefisso CG significa che dovrei importare qualcosa? Altrimenti è solo una convenzione di denominazione ?!
Miele

231

Ci sono alcune funzioni come:

NSStringFromCGPoint  
NSStringFromCGSize  
NSStringFromCGRect  
NSStringFromCGAffineTransform  
NSStringFromUIEdgeInsets

Un esempio:

NSLog(@"rect1: %@", NSStringFromCGRect(rect1));

4
Questi sono i seguenti: "unica cosa in tutto lo sviluppo di iOS che è più utile ma meno conosciuto" !! Heh
Fattie,

7
Nota: per lo sviluppo di Cocoa (OS X), queste funzioni non hanno "CG" nel nome.
peterflynn,


13

Uso la seguente macro per aiutarmi con 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)

Puoi fare qualcosa di simile per CGPoint:

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

Usandolo come segue:

LogCGPoint(cgPoint);

Produrrebbe quanto segue:

cgPoint: (100, 200)

6
Perché non utilizzare semplicemente le funzioni di conversione delle stringhe UIKit integrate ?
ma11hew28,

Lo so. Quelle sono esattamente le funzioni che Alex e Steve hanno pubblicato nelle loro risposte.
e.James,

1
Vale la pena modificare la risposta e aggiungere una nota in alto "Solo per interesse storico ...". Lo faccio sempre, ad esempio stackoverflow.com/questions/402/iphone-app-in-landscape-mode/… stackoverflow.com/questions/5492479/… stackoverflow.com/questions/4212628/… ( "Vale la pena notare che questo post del decennio precedente, in realtà ora è solo di interesse storico. " ) ecc.
Fattie,

1
Questa risposta è ancora utile, nonostante l'esistenza delle funzioni di conversione di UIKit, perché esistono altre strutture in altri framework, che non dispongono di helper NSStringFrom (ad es. MKCoordinateRegion).
Greg Bell,

10

Puoi usarlo NSValueper questo. Un oggetto NSValue è un semplice contenitore per un singolo elemento dati C o Objective-C. Può contenere qualsiasi tipo scalare come int, float e char, nonché puntatori, strutture e ID oggetto.

Esempio:

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

PRODUZIONE : NSPoint: {10, 30}

Spero che ti aiuti.


Grazie @Nishant - necessario per produrre i contenuti di un CMTimeRange e questo ha funzionato.
Molte

5

Dal momento che l'RSS rotto di Stack Overflow mi ha appena risolto questa domanda, ecco la mia soluzione quasi generale: JAValueToString

Ciò ti consente di scrivere JA_DUMP(cgPoint)e di cgPoint = {0, 0}accedere.


L'ho fatto e ho avuto un errore di compilazione. A volte è richiesto l'indirizzo dell'espressione della proprietà o qualcosa del genere
user4951

@Jim Thio: la macro è impostata in modo tale che l'oggetto da ispezionare deve essere un valore. (Non ricordo il perché; qualcosa sul fatto di non essere in grado di gestire correttamente le stringhe C altrimenti.) In breve, assegnare la proprietà a una variabile temporanea, quindi chiamare JA_DUMP su quello.
Jens Ayton,

5

Sì, puoi usare alcune funzioni come: Per prima cosa devi convertire la struttura CGPoint in stringa, vedi esempio

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

Per esempio:

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

Come questo...


2
NSLog(@"%@",CGRectCreateDictionaryRepresentation(rect));
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.