2009-10-14 12 views
5

Tengo una superclase y una subclase, que definen variables de instancia.Objective-C: variables de instancia fuera del alcance en el depurador

esbozo de superclase:

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

Esquema de la subclase:

/* 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]; 
} 

Cuando utilizo las clases que heredan directamente de NSObject, uno no necesita el auto> puntero. Tenga en cuenta que no hay ningún objeto con el nombre str definido en el GenericClass padre. Entonces, mi pregunta es, ¿por qué está fuera de alcance cuando no se hace referencia a self-> str? El código en sí mismo funciona, pero no puedo leer la variable con el depurador

Respuesta

7

GDB no es un compilador de Objective-C. El compilador conoce aspectos como el ámbito léxico dentro de los métodos de Objective-C, pero GDB no. Sin embargo, entiende las variables locales.

En Objective-C, cada método tiene un parámetro implícito self que se le pasa cuando se llama. Entonces, cuando mira self->str, GDB está interpretando eso como si interpretara cualquier otra evaluación de variable local.

Cuando intenta evaluar str por su cuenta, GDB buscará una variable local llamada str y, al no encontrar ninguna, informa que no está dentro del alcance. Esto no es un error; Este es el comportamiento esperado.

+0

Esta es una buena aclaración de cómo funciona el GDB, ¡gracias! Pero hay una cosa que todavía me confunde. Tengo variables definidas en la superclase; llamemos a un NSMutableString * superstr. Una referencia a "superstr" en sí misma en la implementación de SpecificClass funciona bien. Pero intentar acceder a una variable "str" ​​definida en SpecificClass.h no funciona en el depurador sin usar self->. ¿Cómo encuentra GDB una variable heredada, pero no una definida en el encabezado de esta clase? Si no estoy usando la herencia, esto también funciona bien. Parece un error en XCode –

+1

Pruebe 'po str' y' po superstr' en la ventana de la consola del depurador (⇧⌘R). Si estos dan los mismos resultados, el problema no tiene nada que ver con Xcode (que es probable). –

+1

Por extraño que parezca, po str y po superstr funcionan bien en la consola, al igual que po self-> str y po self-> superstr. Solo en la interfaz de usuario de depuración visual, donde la variable str sin self-> informa que está fuera del alcance cuando se mueve con el mouse, pero las operaciones de lectura/escritura en el código funcionan bien. Lo registraré como un error con Apple. Mientras tanto estoy usando self-> en todas partes (aunque preferiría no hacerlo) para poder depurar visualmente. –

Cuestiones relacionadas