2010-06-03 11 views
8

lavorando su un progetto mac os (che significa non iPhone) che richiede 10.6 ed è a 64 bit, mi consente di utilizzare le proprietà per generare sia metodi di accesso che variabili di istanza nel file di intestazione. ma, durante il debug, non vedo come guardare i valori delle proprietà dell'oggetto dopo che sono stati popolati. c'è qualche impostazione di build che deve essere attivata?xcode 3.2.2 e objective-c 2.0 e debug: dove sono i valori della proprietà/istanza della variabile dell'oggetto nel debug?

se sto dichiarando le variabili di istanza di un oggetto (tra {} nell'intestazione), quindi posso vedere quei valori (quando vengono utilizzati) durante il debug nella finestra di debug o usando il cursore-passaggio del mouse sopra il trucco di linea evidenziato nell'editor durante un'interruzione, o facendo cli in gdb come 'p * object' per esempio.

vecchia maniera:

@class Suit; 
@interface Card : NSObject 
{ 
    NSNumber *playOrder; 
    Suit *suit; 
    NSNumber *displayNumber; 
    NSNumber *orderIndex; 
} 
@property(nonatomic, retain) Suit *suit; 
@property(nonatomic, retain) NSNumber *displayNumber; 
@property(nonatomic, retain) NSNumber *orderIndex; 

modo nuovo:

@class Suit; 
@interface Card : NSObject 

@property(nonatomic, retain) Suit *suit; 
@property(nonatomic, retain) NSNumber *displayNumber; 
@property(nonatomic, retain) NSNumber *orderIndex; 
@property(nonatomic, retain) NSNumber *playOrder; 

in questo nuovo conio 10,6 idea 64bit richiesto (che sembra più semplice per me) nessuno di questi metodi di debug visualizzare i valori dell'oggetto. Immagino che devo avere qualcosa spento, perché questa nuova idea, non sembra migliore.

risultati gdb per vecchia maniera:

(gdb) po newCard 
New Card : 0 of Suit : Hearts (NSCalibratedRGBColorSpace 1 0 0 1). with orderIndex of: 1 
(gdb) p *newCard 
$1 = { 
    <NSObject> = { 
    isa = 0x100002188 
    }, 
    members of Card: 
    playOrder = 0x0, 
    suit = 0x200053a20, 
    displayNumber = 0x20001bac0, 
    orderIndex = 0x200012de0 
} 
(gdb) 

risultati gdb per nuovo modo:

(gdb) po newCard 
New Card : 0 of Suit : Hearts (NSCalibratedRGBColorSpace 1 0 0 1). with orderIndex of: 1 
(gdb) p *newCard 
$3 = { 
    <NSObject> = { 
    isa = 0x100002188 
    }, <No data fields>} 
(gdb) 

così guardando la documentazione per Objective-C 2.0:

http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/ObjectiveC/Articles/ocProperties.html#//apple_ref/doc/uid/TP30001163-CH17-SW3

descrive a cosa mi riferisco (sintetizzando le variabili di istanza in "moderno" r untime), ma ciò che non viene detto da nessuna parte, è che se lo fai, i valori non saranno disponibili durante il debug.

ho trovato una pagina SO con informazioni pertinenti, ma non sono concentrato su questo effetto: Using instance variables with Modern Runtime

cosa mi sono perso?

+0

È possibile che sia stata attivata la raccolta garbace? Prova a spegnerlo e controlla se il debugger viene prelevato sui campi. –

+0

sì la garbage collection è attiva in entrambi i test di esempio. – lulu

risposta

2

In GDB, è possibile utilizzare getter proprietà per accedere Ivars dinamici:

 
(gdb) po [newCard displayNumber] 
0 
+0

outis, grazie per la risposta. è in realtà ciò di cui avevo bisogno. ero bloccato a pensare che dovrei usare newCard.displayNumber (nota sintassi del punto) e quando ciò non ha funzionato, dovrei usare p * newCard e seguire da quel risultato. quindi sono rimasto bloccato non vedendo alcun risultato utilizzabile da quello. – lulu

2

Suppongo che tu sia @synthesizing quelle variabili?

Potrebbe anche essere necessario { } nell'interfaccia, quindi il compilatore sa dove metterlo.

@interface Card : NSObject 
{ 

} 

Eviterei questo tipo di sintassi ... specialmente se si definiscono le proprietà da soli.

Inoltre, cercare <objc/runtime.h> e vedere se è possibile stampare un elenco di ivars per la classe. Uso sempre quanto segue per eseguire il debug di metodi o classi da API prive di documentazione.

unsigned int total_method_count = 0; 
    Method * method_list = class_copyMethodList(object_getClass([obj class]), &total_method_count); 
    @try 
    { 
     int method_counter = 0; 
     for (method_counter = 0; method_counter < total_method_count; method_counter++) 
     { 
      Method method = method_list[method_counter]; 
      // check if method the KVC getter you are interested in 
      NSLog(@"Method: %s", sel_getName(method_getName(method))); 
     } 
    } @catch (NSException *e) { 
     //Do Nothing 
    } 
+0

sì, il file .m ha @synthesize per le proprietà in entrambi gli esempi. come usare '{}' nel secondo esempio, sto usando l'idea che se un progetto è impostato per essere 64-bit e richiede 10.6 per essere eseguito, allora le variabili di istanza possono essere sintetizzate, e '{}' è non necessario. quindi la mia estrema sorpresa non trova dati da usare nel debug, quindi ho sicuramente qualcosa che non va. proverò il tuo codice e riferirò. grazie, Stephen. – lulu

+0

posso vedere dove l'idea sopra può essere utile, così come utilizzare le funzioni di intestazione di runtime nel debug come strategia, e probabilmente aiuterà anche gli altri. quello che sto chiedendo è che sembra che se io uso ivars sintetizzati nella creazione di progetti che sono a 64-bit, 10.6 runtime, quindi non vedo il debug dei riferimenti di dati, e per me, questo sembra così strano, (per non essere in grado di usare debug gdb o xcode) che sono sicuro di aver perso qualcosa nel mio setup. quindi questa è la base della mia domanda: "cosa mi è mancato?". – lulu

+0

Tutto ciò a cui facevo riferimento era il fatto che il compilatore potrebbe non generare affatto gli ivars. Quindi, perché dovresti usare il runtime per assicurarti che siano generati e non fare affidamento solo su (gdb) o sul debugger di XCode. Inoltre, poiché il compilatore non sta facendo nulla di intelligente, potresti voler aggiungere il '{}' per assicurarti che il compilatore sappia dove mettere quel codice. Sfortunatamente questo è il massimo che posso aiutarti. Se non riesci a vedere i tuoi ivars con il runtime.h allora il "nuovo" modo è solo un mucchio di malvagità da cavallo e non dovresti mai usare una sintassi "invisibile" del genere comunque. –

2

Ho avuto lo stesso problema con ivars sintetizzati. La mia soluzione era passare al compilatore LLVM 1.6 in XCode 3.25.Questo ha portato suggerimenti per il debugger (molto utile per me), ma la finestra delle variabili non riesce ancora a mostrare gli ivars.

Problemi correlati