È 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.