Mam nadklasę i podklasę, obie definiujące zmienne instancji.Objective-C: zmienne instancji poza zakresem w debugerze
Wstępne planowanie nadklasy:
/* GenericClass.h */
@interface GenericClass : NSObject {
/* some variables */
}
@end
/* GenericClass.m */
@implementation GenericClass
/* ... */
@end
Zarys podklasy:
/* 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];
}
Kiedy używam klas, które dziedziczą bezpośrednio z NSObject, nie trzeba się samo-> wskaźnik. Zauważ, że nie ma obiektu o nazwie str zdefiniowanej w macierzystej GenericClass. Moje pytanie brzmi, dlaczego jest poza zakresem, kiedy nie jest określany jako self-> str? Kod sam w sobie działa, ale nie mogę odczytać zmiennej za pomocą debuggera:
To jest dobre wyjaśnienie działania GDB, dzięki! Ale jest jeszcze jedna rzecz, która wciąż mnie myli. Mam zmienne zdefiniowane w nadklasie; nazwijmy jeden NSMutableString * superstr. Odwołanie się do "superstr" na własną rękę w implementacji SpecificClass działa dobrze. Ale próba dostępu do zmiennej "str" zdefiniowanej w pliku SpecificClass.h nie działa w debugerze bez użycia self->. W jaki sposób GDB znajduje dziedziczoną zmienną, ale nie zdefiniowaną w nagłówku tej klasy? Jeśli nie używam dziedziczenia, to również działa dobrze. Wygląda jak błąd w XCode –
Wypróbuj 'po str' i' po superstr' w oknie Konsoli Debuggera (⇧⌘R). Jeśli dają te same wyniki, problem nie ma nic wspólnego z Xcode (co jest prawdopodobne). –
Co dziwne, postr i po superstr działa dobrze w konsoli, podobnie jak po self-> str i po self-> superstr. Tylko w interfejsie debugowania wizualnego zmienna str bez self-> raportów wykracza poza zakres po przeniesieniu myszką, ale operacje odczytu/zapisu w kodzie działają dobrze. Loguję to jako błąd w Apple. Tymczasem używam self-> wszędzie (chociaż wolałbym tego nie robić), aby móc wizualnie debugować. –