2009-10-14 79 views
5

我有一個超類和一個子類,它們都定義了實例變量。Objective-C:實例變量超出了調試器的範圍

超的粗線條:

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

子類概況:

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

當我使用直接從NSObject的繼承類,一個不需要自我>指針。請注意,沒有在父GenericClass中定義名稱str的對象。 所以,我的問題是,爲什麼當沒有被引用爲self> str時,str超出了範圍?代碼本身工作,但我無法用調試器讀取變量

回答

7

GDB不是Objective-C編譯器。編譯器知道像Objective-C方法中的詞法範圍,但GDB不知道。但是,它確實瞭解局部變量。

在Objective-C中,每個方法在調用時都會傳遞一個隱含的self參數。因此,當你看到self->str時,GDB正在解釋它是否會解釋任何其他局部變量評估。

當您嘗試自行評估str時,GDB將查找名爲str的局部變量,但未找到該變量則報告它不在範圍內。這不是一個錯誤;這是預期的行爲。

+0

這是GDB工作原理的一個很好的說明,謝謝!但有一件事仍令我困惑。我有超類定義的變量;讓我們調用一個NSMutableString * superstr。在SpecificClass的實現中對「superstr」的引用可以正常工作。但是嘗試訪問SpecificClass.h中定義的變量「str」,在調試器中不使用self>。 GDB如何找到一個繼承的變量,但沒有在這個類自己的頭文件中定義的變量?如果我不使用繼承,這也可以工作。看起來像是XCode中的一個錯誤 – 2009-10-14 17:10:15

+1

在Debugger Console窗口(⇧⌘R)中嘗試'po str'和'po superstr'。如果這些結果相同,這個問題與Xcode無關(很可能)。 – 2009-10-14 19:48:37

+1

奇怪的是,po str和po superstr在控制檯中工作正常,po自我> str和po自我> superstr。只有在可視化調試UI中,當使用鼠標移動時,沒有自我報告的str變量超出範圍,但代碼中的讀/寫操作工作得很好。我會將它記錄爲Apple的錯誤。同時,我在所有地方都使用自我(儘管我不想),以便可以進行可視化調試。 – 2009-10-15 12:53:23