2010-10-04 49 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