2009-10-14 6 views
5

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:

Odpowiedz

7

GDB nie jest kompilatorem Objective-C. Kompilator wie o takich rzeczach jak zakres leksykalny w metodach Objective-C, ale GDB tego nie robi. Rozumie jednak zmienne lokalne.

W Objective-C każda metoda ma niejawny parametr self przekazany do niej po wywołaniu. Więc gdy patrzysz na self->str, GDB interpretuje to tak, jakby interpretowało każdą inną ocenę zmiennej lokalnej.

Kiedy spróbujesz samodzielnie oszacować wartość str, GDB wyszuka lokalną zmienną o nazwie str i, nie znajdując, zgłosi, że nie znajduje się ona w zasięgu. To nie jest błąd; to jest oczekiwane zachowanie.

+0

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 –

+1

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

+1

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