2009-10-14 7 views
5

J'ai une superclasse et une sous-classe, qui toutes deux définissent des variables d'instance.Objective-C: variables d'instance hors de portée dans le débogueur

ébauche de superclasse:

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

Aperçu de la sous-classe:

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

Quand je suis en utilisant des classes qui héritent directement de NSObject, on n'a pas besoin de l'auto> pointeur. Notez qu'il n'y a pas d'objet avec le nom str défini dans la classe GenericClass parent. Donc, ma question est, pourquoi est str hors de portée quand il n'est pas référencé comme self-> str? Le code en lui-même fonctionne, mais je ne peux pas lire la variable avec le débogueur

Répondre

7

GDB n'est pas un compilateur Objective-C. Le compilateur connaît des choses comme la portée lexicale dans les méthodes Objective-C, mais pas GDB. Il comprend cependant les variables locales.

En Objective-C, chaque méthode a un paramètre self implicite qui lui est passé lorsqu'il est appelé. Donc, quand vous regardez self->str, GDB interprète cela comme s'il interprétait n'importe quelle autre évaluation de variable locale.

Lorsque vous tentez d'évaluer str seul, GDB recherchera une variable locale appelée str et, n'en trouvant pas, signalera qu'il ne fait pas partie de la portée. Ce n'est pas une erreur. C'est le comportement attendu.

+0

Ceci est une bonne clarification du fonctionnement de la GDB, merci! Mais il y a une chose qui me trouble encore. J'ai des variables définies dans la superclasse; appelons un NSMutableString * superstr. Une référence à "superstr" seul dans l'implémentation de SpecificClass fonctionne bien. Mais tenter d'accéder à une variable "str" ​​définie dans SpecificClass.h ne fonctionne pas dans le débogueur sans utiliser self->. Comment GDB trouve-t-il une variable héritée, mais pas une variable définie dans l'en-tête de cette classe? Si je n'utilise pas l'héritage, cela fonctionne aussi très bien. Cela ressemble à un bogue dans XCode –

+1

Essayez 'po str' et' po superstr' dans la fenêtre de la console du débogueur (⇧⌘R). Si ceux-ci donnent les mêmes résultats, le problème n'a rien à voir avec Xcode (ce qui est probable). –

+1

Assez curieusement, po str et po superstr fonctionnent bien dans la console, tout comme po self-> str et po self-> superstr. C'est uniquement dans l'interface utilisateur de débogage visuel que la variable str sans auto-> rapports est hors champ lorsqu'elle est déplacée avec la souris, mais les opérations de lecture/écriture dans le code fonctionnent très bien. Je vais l'enregistrer comme un bug avec Apple. Pendant ce temps, j'utilise self-> partout (bien que je préfère ne pas le faire) afin que je puisse déboguer visuellement. –

Questions connexes