2009-10-14 3 views
5

Ho una superclasse e una sottoclasse, che definiscono entrambe le variabili di istanza.Objective-C: variabili di istanza fuori ambito nel debugger

abbozzo di superclasse:

/* GenericClass.h */ 
@interface GenericClass : NSObject { 
    /* some variables */ 
} 
@end 
/* GenericClass.m */ 
@implementation GenericClass 
    /* ... */ 
@end 

Schema di sottoclasse:

/* SpecificClass.h */ 
#import "GenericClass.h" 
@interface SpecificClass : GenericClass { 
    NSMutableString *str; 
} 
/* SpecificClass.m */ 
#import "SpecificClass.h" 
@implementation SpecificClass 
- (void)aMethod { 
    //Debugger reports str as out of scope 
    str = [[NSMutableString alloc] initWithCapacity:100]; 
    //Works fine: 
    self->str = [[NSMutableString alloc] initWithCapacity:100]; 
    //Doesn't compile as I haven't defined @property/@synthesize: 
    self.str = [[NSMutableString alloc] initWithCapacity:100]; 
} 

Quando sto usando le classi che ereditano direttamente da NSObject, uno non ha bisogno l'auto-> puntatore. Si noti che non esiste un oggetto con il nome str definito nella GenericClass genitore. Quindi, la mia domanda è, perché è str out scope quando non referenziato come self-> str? Il codice in sé funziona, ma non riesco a leggere la variabile con il debugger

risposta

7

GDB non è un compilatore Objective-C. Il compilatore sa cose come lo scope lessicale all'interno dei metodi Objective-C, ma GDB no. Tuttavia, comprende le variabili locali.

In Objective-C, ogni metodo ha un parametro implicito self passato ad esso quando viene chiamato. Quindi, quando guardi allo self->str, GDB sta interpretando che come avrebbe interpretato qualsiasi altra valutazione delle variabili locali.

Quando si tenta di valutare str da solo, GDB cercherà una variabile locale denominata str e, non trovandola, segnala che non è in ambito. Questo non è un errore; Questo è il comportamento previsto.

+0

Questo è un buon chiarimento di come funziona il GDB, grazie! Ma c'è ancora una cosa che mi confonde. Ho delle variabili definite nella superclasse; chiamiamo una NSMutableString * superstr. Un riferimento a "superstr" da solo nell'implementazione di SpecificClass funziona bene. Ma il tentativo di accedere a una variabile "str" ​​definita in SpecificClass.h non funziona nel debugger senza usare self->. In che modo GDB trova una variabile ereditata, ma non una definita nell'intestazione di questa classe? Se non sto usando l'ereditarietà, anche questo funziona bene. Sembra un bug in XCode –

+1

Prova 'po str' e' po superstr' nella finestra Debugger Console (⇧⌘R). Se quelli danno gli stessi risultati, il problema non ha nulla a che fare con Xcode (che è probabile). –

+1

Stranamente, po str e po superstr funzionano bene nella console, come fanno auto-> str e po auto-> superstr. È solo nell'interfaccia utente di debug visivo dove la variabile str senza self-> segnala di essere fuori dall'ambito quando viene spostata con il mouse, ma le operazioni di lettura/scrittura nel codice funzionano bene. Lo registrerò come un bug con Apple. Nel frattempo sto usando auto-> ovunque (anche se preferirei non farlo) in modo da poter eseguire il debug visivamente. –