2010-10-04 51 views
4

我有一個遞歸下降樹對象。我希望能夠設置斷點並在Xcode調試器中檢查它。檢查頂級的作品就好了。但是,當我下降到某個水平後,調試人員表示ivars的價值超出了範圍。有什麼辦法可以防止這種情況發生?Xcode調試器 - 檢查深度嵌套對象

編輯:

響應於評論 -

的實例變量是類表達的目的。嵌套主要來自身體ivar,它通常是表達式對象的NSMutableArray。所以,你可能有這樣的結構:

-expression
---體(2個表達式)
----- 0表達
-------體(1點式)
---------- 0 Expression
------------ body [empty]
----- 1 Expression
------- body [空]

還有一個頭伊娃,這是類令牌的對象,反過來有一些字符串Ivars,不嵌套。

我使用調試器的方式 - 我在Expression對象中的方法中設置了一個斷點。然後,我點擊顯示三角形的參數,然後是自我,然後是身體伊娃,然後是體內伊娃的表情,等等。但最終調試器會停止告訴我事情的價值。

+0

從這個答案開始賞金。最好的答案是不涉及編寫任何代碼的問題。但即使是一個包含額外代碼以將ivars帶入作用域的答案,如果有一種方法我可以編寫一次代碼,然後就能夠檢查我的類的任何對象樹,而無需預先確切指定樹中的位置我會在運行時去。 – 2010-10-06 20:50:51

+0

你能指定Ivars類型嗎?你如何使用調試器?在gdb的控制檯中鍵入鼠標點擊或命令? – jv42 2010-10-07 12:54:56

+1

這個線程可能是你感興趣的:http://stackoverflow.com/questions/1427871/xcode-3-2-debug-seeing-whats-in-an-array – user8472 2010-10-07 14:29:05

回答

2

我建議將此添加到您的Expression類中。然後,您可以在調試器中打印po [expression explode]以打印表達式的樹。先決條件是您的Expression類的一個適當的-description方法,可打印出其餘的ivars。

- (void) explodeAtLevel:(int)aLevel { 
    NSMutableString* out = [[NSMutableString alloc] init]; 

    for (int i = 0; i < aLevel; i++) [out appendString:@"-"]; 

    [out appendString:self.description]; 
    printf("%s\n", [out UTF8String]); 
    [out release]; 

    for (id *subitem in body) 
     if ([subitem isMemberOfClass:[Expression class]]) 
     [((Expression*)subitem) explodeAtLevel:(aLevel + 1)]; 
} 


- (void) explode { 
    [self explodeAtLevel:0]; 
} 
+0

這似乎是我能做的最好的。雖然isKindOfClass比isMemberOfClass好得多。一個問題 - 當我在調試器中運行該方法時,我經常會收到消息「值不能轉換爲整數」。當我從程序中的代碼運行相同的方法時,我沒有收到該消息。你能解釋一下怎麼回事? – 2010-10-13 17:09:39

+0

如果您有基類的子類,'isKindOfClass'確實更好。至於調試器消息,我建議嘗試註釋'[out appendString:self.description];'。如果問題消失了,這是用'-description'方法。 – 2010-10-13 19:42:32