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
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 –
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). –
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. –